Почему я получаю исключение StringIndexOutOfBoundsException при попытке пропустить несколько строк с помощью BufferedReader? - PullRequest
2 голосов
/ 07 июля 2019

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

Когда я читаю текстовый файл, я говорю циклу while, который я использую, чтобы продолжить, если есть что-то, что не является именем в данной строке.Кажется, это вызывает исключение в некоторых (не во всех) областях, где есть несколько строк без имен.

Как я могу заставить программу работать без исключений или читать строки без имен на них?

Мой код:

public class Rewrite {

public static void main(String[] args) {

   loadFromFile();
}

private static void loadFromFile() {

   String[] names = new String[1000];

   try {

      FileReader fr = new FileReader("src/res/names/Galaxy_System_Names.txt");
      BufferedReader br = new BufferedReader(fr);

      String aLine;
      int countIndex = 0;
      while ((aLine = br.readLine()) != null) {

         // skip lines without names
         if (aLine.equals(String.valueOf(System.lineSeparator()))) {
            aLine = br.readLine();
            continue;
         } else if (aLine.equals("&")) {
            aLine = br.readLine();
            continue;
         } else if (aLine.startsWith("(")) {
            aLine = br.readLine();
            continue;
         }

         System.out.println(aLine);

         // capitalize first letter of the line
         String firstLetter = String.valueOf(aLine.charAt(0));
         aLine = firstLetter + aLine.substring(1);

         names[countIndex++] = aLine;
      }

      br.close();

   } catch (IOException e) {

      e.printStackTrace();
   }
}
}

Исключение:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)
    at java.base/java.lang.String.charAt(String.java:702)
    at utilities.Rewrite.loadHumanNamesFromFile(Rewrite.java:39)
    at utilities.Rewrite.main(Rewrite.java:10)

Текст-файлпример: Это выдает ошибку после имени "amor"

áed
áedán
aegle
aella
aeneas
aeolus
aeron
(2)

&
aeson
agamemnon
agaue
aglaea
aglaia
agni
(1)
agrona
ahriman
ahti
ahura
mazda
aias
aigle
ailill
aineias
aino
aiolos
ajax
akantha
alberic
alberich
alcides
alcippe
alcmene
alcyone
alecto
alekto
alexander
alexandra
alexandros
alf
(1)
alfr
alkeides
alkippe
alkmene
alkyone
althea
alvis
alvíss
amalthea
amaterasu
amen
ameretat
amirani
ammon
amon
amon-ra
amor

&
amordad
amulius
amun

Ответы [ 2 ]

2 голосов
/ 07 июля 2019

Из документов BufferedReader::readLine:

Возвращает: строка, содержащая содержимое строки, не включая символы окончания строки

Таким образом, когда вы доберетесь до этой части файла:

amor

&

Она прочитает пустую строку и удалит символ перевода строки, и все, что останется, это пустой String.Следовательно, оно не будет обнаружено вашим оператором if:

if (aLine.equals(String.valueOf(System.lineSeparator())))

Вам необходимо добавить в чек для isEmpty()

0 голосов
/ 07 июля 2019

После amor - пустая строка. Вы пытаетесь получить символ по индексу 0 пустой строки. Поскольку это пустая строка, очевидно, что в ней нет символов, и поэтому в индексе 0

отсутствует символ.
...