2015-05-07 2 views
-1

, поэтому этот код предназначен для открытия текстового файла с правильным именем, а затем он предназначен для разделения каждой строки, которую программа читает после каждой запятой. , Пример из текстового файла :Чтение из текстового файла и разделение строк на чтение

Germany,5,3,6,2,3 
Argentina,3,5,2,1,1 
+0

см. Здесь, в строке '' Германия, 5,3,6,2,3 ", общие значения, разделенные запятой, равны 6. Таким образом, очевидно, что если вы попытаетесь использовать' newStrings [6] ', он будет вызывать' ArrayIndexOutOfBoundsException '. –

+0

Вы пытаетесь прочитать 7 элементов (от индекса 0 до 6), но ваш пример содержит только 6 элементов. Поэтому в этой строке это не удастся:> NewTeam.setTotalPoints (Integer.valueOf (newStrings [6])); – User404

+0

если я удалю «NewTeam.setTotalPoints (Integer.valueOf (newStrings [6]))« Затем я получаю «ArrayIndexOutOfBoundsException: 1» - Почему это? – fmorgan91

ответ

1

Перед цикл может быть, собрать команду:

List<Team> teams = new ArrayList<>(); 

Внутри проверки петли, что вы действительно 7 полей (думаю, пустых строк, ошибки данных)

if (newStrings.length != 7) { 
    System.out.println("Error in line: " + currentLine); 
    continue; // Still handle rest 
} 

Кроме того, как вы раскол по всей линии, забудьте сканер lineScanner, он лишний.

 while ((currentLine = bufferedReader().readLine()) != null) { 

или более читаемым:

 for (;;) { 
      String currentLine = bufferedReader().readLine(); 
      if (currentLine == null) { 
       break; 
      } 

На петли:

  teams.add(newTeam): 

что-то вроде:

List<Team> readTeams() throws IOException { 
    OUDialog.alert("Select input file for " + this.getPoolName()); 
    String fileName = OUFileChooser.getFilename(); 
    Path aFile = Paths.get(fileName); 
    try (BufferedReader bufferedFileReader = Files.newBufferedReader(aFile)) { 
     String currentLine = bufferedFileReader.readLine(); 
     if (currentLine != null && currentLine.equals(this.getPoolName())) { 
      List<Team> teams = new ArrayList<>(); 

      while ((currentLine = bufferedReader.readLine()) != null) { 
       String[] newStrings = currentLine.split(","); 
       if (teams.length == 0) { 
        continue; // Allow empty lines 
       } 
       if (teams.length != 7) { 
        throw new IOException("Wrong line:" + currentLine); 
       } 
       Team newTeam = new Team(newStrings[0]); 
       newTeam.setWon(Integer.valueOf(newStrings[1])); 
       newTeam.setDrawn(Integer.valueOf(newStrings[2])); 
       newTeam.setLost(Integer.valueOf(newStrings[3])); 
       newTeam.setFourOrMoreTries(Integer.valueOf(newStrings[4])); 
       newTeam.setSevenPointsOrLess(Integer.valueOf(newStrings[5])); 
       newTeam.setTotalPoints(Integer.valueOf(newStrings[6])); 
       teams.add(newTeam); 
      } 
      return teams; 
     } else { 
      throw new IOException("Wrong file selected"); 
     } 
    } // Closes always. 
} 

В этом сообщении сообщается об ошибках.

+0

Если я удаляю строку LineCcanner, цикл не продолжается, currentLine устанавливается на bufferedReader и проверяет, является ли он правильным файлом, если это тогда, то lineScanner берет на себя и считывает строки вместо этого. Есть ли лучший способ сделать это? – fmorgan91

+0

Хорошо, я закодировал это. –

2

ArrayIndexOutOfBoundsException означает, что вы пытаетесь получить доступ к индексу, который не существует в массиве. Глядя на ваш код и ваши входы образцов, вы пытаетесь получить доступ к 7 элементам массива (индексы 0-6), но входы имеют только 6 входов, что означает, что, как только он попытается позвонить NewTeam.setTotalPoints(Integer.valueOf(newStrings[6]));, это вызовет исключение.

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

Смежные вопросы