Наличие этой ошибки java.lang.ArrayIndexOutOfBoundsException, которая останавливает меня от продолжения моей итерации цикла - PullRequest
0 голосов
/ 02 ноября 2019

Я работал над своим заданием и пытался прочитать данные из моего текстового файла. Пока я пытался сохранить эту информацию в другом массиве один за другим, возникает ошибка, подобная этой

Но при выводе на консоль это показывает, что он действительно прошел первую итерацию, но возникла эта ошибка и остановкаэто

Это мой код ниже

public static void readFile() {

    cucibleID = new String[100];
    name = new String[100];
    matricNo = new String[100];
    date = new String[100];
    spvName = new String[100];

    try {
        Scanner sc = new Scanner(file);

        while(sc.hasNext()) {
            String readLine = sc.nextLine();



            String[] splitted = readLine.split("\t");

            for(int i=0,j=0; i< splitted.length;i++) {

                cucibleID[i] = splitted[j++];
                name[i] = splitted[j++];
                matricNo[i] = splitted[j++];
                date[i] = splitted[j++];
                spvName[i] = splitted[j++];

                System.out.println(cucibleID[i] +" "+ name[i]);
            }

        }

    }catch(Exception e) {
            e.printStackTrace();
        }
    }


Это мой вывод ошибок в моей консоли .... (Примечания: 1L5 John в этом ниже от System.out.println(cucibleID[i] +" "+ name[i]);)

1L5 John
java.lang.ArrayIndexOutOfBoundsException: 5
    at ASSN1.main.readFile(main.java:99)
    at ASSN1.main.main(main.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)


Ответы [ 4 ]

0 голосов
/ 02 ноября 2019

Вам не нужен цикл for. Используйте j для элементов в разделенной записи. j должно начинаться с 0 для каждой записи. Используйте i для обработанной записи.

Возможно, вам пришлось добавить дополнительную логику, чтобы иметь дело с записью, содержащей менее 5 элементов

public static void readFile() {

    cucibleID = new String[100];
    name = new String[100];
    matricNo = new String[100];
    date = new String[100];
    spvName = new String[100];
    int i = 0;

    try {
        Scanner sc = new Scanner(file);

        while(sc.hasNext()) {
            String readLine = sc.nextLine();
            String[] splitted = readLine.split("\t");
            int j = 0;

            cucibleID[i] = splitted[j++];
            name[i] = splitted[j++];
            matricNo[i] = splitted[j++];
            date[i] = splitted[j++];
            spvName[i] = splitted[j++];

            System.out.println(cucibleID[i] +" "+ name[i]);

            i++;

        }

    }catch(Exception e) {
        e.printStackTrace();
    }
}
0 голосов
/ 02 ноября 2019

Ваш код должен выглядеть примерно так:

public static void readFile() throws IOException {
    cucibleID = new String[100];
    name = new String[100];
    matricNo = new String[100];
    date = new String[100];
    spvName = new String[100];
    try (BufferedReader in = Files.newBufferedReader(file.toPath())) {
        String line;
        for (int i = 0; (line = in.readLine()) != null; i++) {
            String[] splitted = line.split("\t");
            cucibleID[i] = splitted[0];
            name[i] = splitted[1];
            matricNo[i] = splitted[2];
            date[i] = splitted[3];
            spvName[i] = splitted[4];
            System.out.println(cucibleID[i] +" "+ name[i]);
        }
    }
}

Изменено Scanner на BufferedReader, потому что Scanner очень медленно.

0 голосов
/ 02 ноября 2019

Позвольте мне объяснить, что делает ваш цикл for-each. Предполагая, что длина вашего массива splittet равна 5.

Первая итерация:

  • i = 0; j = 0;
  • Строка с cucibleID -> i = 0; j = 0; и j++, которыеозначает, что j будет j = 1;
  • Строка с именем -> i = 0; j = 1; и j++, что означает, что j будет j = 2;
  • Строка с matricNo -> i = 0; j = 2; и j++ это означает, что j будет j = 3;
  • Строка с датой -> i = 0; j = 3; и j++, что означает, что j будет j = 4;
  • Строка с spvName -> i = 0; j = 4; иj++, что означает, что j будет j = 5;
  • Конец первой итерации. i = 0 -> i < 7 -> i++

Итерация звука

  • i = 1; j = 5;
  • Строка с cucibleID -> i = 0; j = 5;и ArrayIndexOutOfBound произойдет

Как вы можете видеть из моего примера, следующее: у вас правильный индекс i для вашего разделенного массива, но вы используете j в качестве индекса. Следующий код установит ваши массивы правильно на индекс 0, при условии, что ваш разделенный массив имеет 5 элементов

int i = 0;
int j = 0; 
if(splitted.length == 5) {
    cucibleID[i] = splitted[j++];
    name[i] = splitted[j++];
    matricNo[i] = splitted[j++];
    date[i] = splitted[j++];
    spvName[i] = splitted[j++];
}
0 голосов
/ 02 ноября 2019

добавить проверку перед доступом к индексу массива

  String[] splitted = readLine.split("\t");
 for(int i=0,j=0; i< splitted.length;i++) 
{ 
  if(splitted.length > j)
    cucibleID[i] = splitted[j++]; 
 if(splitted.length > j)
    name[i] = splitted[j++]; 
if(splitted.length > j)
    matricNo[i] = splitted[j++]; 
if(splitted.length > j)
    date[i] = splitted[j++]; 
if(splitted.length > j)
    spvName[i] = splitted[j++];     
  if(cucibleID.length >i && name.length >i)
  System.out.println(cucibleID[i] +" "+ name[i]);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...