Out of Bounds Exception,需要建议

时间:2015-11-18 02:03:18

标签: java arrays java.util.scanner indexoutofboundsexception

我已经阅读完了教程,所以无论如何,如果你看到我在这里做错了什么,请告诉我,这样我就可以学会更好地参与这个网站。

下面的getPerishedPassengers方法给了我一个越界异常。我已经研究和研究了,我似乎正在正确地填充数组,我不知道我创建的方法有什么问题。有人可以指导我如何克服这个例外吗?谢谢大家!

这是主要/方法:

int passengerMax = 2000;
int passengerActual = 0;

//Create a 2D array that will store the data from the .txt file 
String[][] passengerData = new String[passengerMax][6];

//Constructor to read the file and store the data in the array
Titanic(String file) throws FileNotFoundException {
    try (Scanner fileIn = new Scanner(new File(file))) {

        //Conditional for reading the data
        while (fileIn.hasNextLine()) {

            //tab through the data to read
        passengerData[passengerActual++] =     fileIn.nextLine().split("\t");
        }
    }
}

public int getTotalPassengers() {
    return passengerActual;
}

//Method for getting/returning the number of passengers that perished
public int getPerishedPassengers() {
    int count = 0;

    //For loop w/conditional to determine which passengers perished
    for (int i = 0; i < getTotalPassengers(); i++) {
        int survive = Integer.parseInt(passengerData[i][1]);

        /*The program reads the file and if 1, the passenger survived. If 0,
        the passenger perished. Conditional will add to the count if they 
        survived*/
        if (survive == 0) {
            count++;
        }
    }

    return count;
}

这是我收到的堆栈跟踪。如果你们愿意,我也可以包含测试代码。提前致谢:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at titanic.Titanic.getPerishedPassengers(Titanic.java:66)
at titanic.testTitanic.main(testTitanic.java:68)
Java Result: 1

1 个答案:

答案 0 :(得分:3)

从上面我看到的,问题在于:

int survive = Integer.parseInt(passengerData[i][1]);

我最好的猜测是,缺少输入文件,当你正在读取文件时,至少有一行创建一个长度为0或1的数组。很有可能,如果文件的最后一行是空行,这条线会导致你的数组超出边界异常,因为分割会创建一个长度为0的数组。另一个原因是一条线根本没有任何标签(比如空格而不是标签等等)。 )将创建一个长度为1的数组,其中passengerData [i] [1]将不存在,只有passengerData [i] [0]将会存在。

假设您的输入文件没有任何格式不正确的行/缺少适当数量的标签,我建议在文件读取循环中更改此行:

passengerData[passengerActual++] =     fileIn.nextLine().split("\t");

为:

String incomingLine = fileIn.nextLine().trim();
if (null != incomingLine && !incomingLine.isEmpty()) {
    passengerData[passengerActual++] = incomingLine.split("\t");
}