ArrayIndexOutOfBoundsException в пределах жестко закодированных границ - PullRequest
0 голосов
/ 21 марта 2019

Работа над заданием, в котором я должен читать данные из файла в массив, чтобы выполнить некоторые демонстрации поиска / сортировки.

public class A5 {
public static void main(String[] args) throws FileNotFoundException, IOException {
     fileToArray();
}
 /**
 * populates array from file
 * @throws IOException
 * @throws FileNotFoundException
 */
public static <T extends Comparable<T>> void fileToArray() throws IOException, FileNotFoundException {
    int FileIndex = 0;

    A5GItem[] gItems = new A5GItem[5150];
        File file = new File("GroceryData.txt");
        Scanner inputFile = new Scanner(file);


        while (inputFile.hasNext()) {
                String line = inputFile.nextLine().replace(" oz", "").replace("«", "");

            String[] tokens = line.split(";");
            if (tokens.length == 5) {

            System.out.println(tokens[0]);
            System.out.println(tokens[1]);
            System.out.println(tokens[2]);
            System.out.println(tokens[3]);
            System.out.println(tokens[4]);
            System.out.println(FileIndex);

            FileIndex++;
            else {
                System.out.println("Bad line: " + line);} 
                        }   }`

Я попытался проверить, правильно ли я заполнил массив, зациклив некоторые операторы println.Он правильно маркирует первые 400 (примерно) элементов в списке, а затем печатает только половину последнего токена и выбрасывает

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at A5.fileToArray(A5.java:59) at A5.main(A5.java:16)

после прохождения с этим индексом на протяжении многих итераций.Не уверен, с чего начать устранение неполадок.

1 Ответ

0 голосов
/ 21 марта 2019

Очевидно, что одна из строк в файле "GroceryData.txt" не содержит 5 токенов.Обратите внимание, что метод split() возвращает массив, размер которого не может быть 5. Поэтому инициализация переменной tokens не требуется.Кажется, переменная FileIndex считает количество прочитанных строк, поэтому я предлагаю распечатать ее, а также распечатать размер массива tokens после split(), например,

while (inputFile.hasNext()) {
    String line = inputFile.nextLine().replace(" oz", "").replace("«", "");
    String[] tokens = line.split(";");
    FileIndex++;
    System.out.println("Line: " + FileIndex + " has " + tokens.length + " tokens.");
}

Затем вы узнаете, какая строкафайла не так, как вы ожидаете.

Кстати, в отношении соглашения об именах, которое упоминают комментаторы, это просто соглашение.Это не то, что вызывает вашу ArrayIndexOutOfBoundsException

Кроме того, трассировка стека, которую вы разместили, указывает, что в строке 59 вашего кода содержится проблема.Я полагаю, что это была бы эта строка ...

System.out.println(tokens[2]);

Печать элементов массива предполагает, что он содержит 5 элементов, но, как я и другие упоминали, метод split() может не возвращать массив из 5 элементов.

...