Java 代码不会编译,没有可见错误

Java 代码不会编译,没有可见错误,java,Java,该代码模拟使用FIFO和LIFO销售股票。我现在只是想让FIFO工作,我们使用的是策略模式。我和我的朋友相信我们的代码是正确的,因为在你运行代码之前没有错误。下面我将所有的类都标记为1-5,而Output标记为Output 第一类 package cop4814; import java.io.File; import java.io.FileNotFoundException; import java.util.*; public class Portfolio { private Sel

该代码模拟使用FIFO和LIFO销售股票。我现在只是想让FIFO工作,我们使用的是策略模式。我和我的朋友相信我们的代码是正确的,因为在你运行代码之前没有错误。下面我将所有的类都标记为1-5,而Output标记为Output

第一类

package cop4814;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class Portfolio {
private SellStrategy strategy;
List<Transaction> buyList = new ArrayList<>();
List<Transaction> sellList = new ArrayList<>();

public boolean readDataFile(String path) {
    try {
        Scanner in = new Scanner(new File(path));
        while (in.hasNextLine()) {
            String[] fields = in.nextLine().split(",");
            if (fields[0].equals("B")) {
                buyList.add(new Transaction(fields));
            } else if (fields[0].equals("S")) {
                sellList.add(new Transaction(fields));
            }

        }
    } catch (FileNotFoundException ex) {
        System.out.println("Error: " + ex.toString());
        return false;
    }
    return true;
}

public void processTransactions() {
    for (Transaction t : sellList) {
        System.out.println(strategy.sell(t,buyList));
    }
}

public void setSellStrategy(SellStrategy howToSell) {
    strategy = howToSell;
}
第五课我的测试课

import cop4814.*;

public class PortfolioTester {

    private static final String inputFilePath = "transactions.txt";

    void start() {
        Portfolio p = new Portfolio();
        if( p.readDataFile( inputFilePath )) {
            p.setSellStrategy( new Sell_LIFO() );
            p.processTransactions();      // also prints the report
            p.setSellStrategy( new Sell_FIFO() );
            p.processTransactions();      // prints a second report
        }
        else {
            System.out.println("Unable to open input file: " + inputFilePath );
        }           
    }

    public static void main(String[] args) {
        new PortfolioTester().start();
    }

}
输出

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:418)
    at java.util.ArrayList.get(ArrayList.java:431)
    at cop4814.Sell_FIFO.sell(Sell_FIFO.java:18)
    at cop4814.Portfolio.processTransactions(Portfolio.java:43)
    at PortfolioTester.start(PortfolioTester.java:13)
    at PortfolioTester.main(PortfolioTester.java:21)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
您正在接收,这意味着您试图访问具有非法索引的数组

错误可能来自以下行:

Transaction found = buyList.get(buyList.indexOf(stockToSell));
您应该首先检查列表中是否存在该项:

if (buyList.contains(stockToSell)) {
    // do work
}

如果您能够运行代码并获得异常,则代码将不会编译。另请看ArrayIndexOutOfBoundsException是一个运行时错误。这意味着您的代码编译成功。是时候学习如何使用IDE的调试器了。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:418)
    at java.util.ArrayList.get(ArrayList.java:431)
    at cop4814.Sell_FIFO.sell(Sell_FIFO.java:18)
    at cop4814.Portfolio.processTransactions(Portfolio.java:43)
    at PortfolioTester.start(PortfolioTester.java:13)
    at PortfolioTester.main(PortfolioTester.java:21)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
Transaction found = buyList.get(buyList.indexOf(stockToSell));
if (buyList.contains(stockToSell)) {
    // do work
}