当我尝试使用BufferedReader跳过多行时,为什么会出现StringIndexOutOfBoundsException?

时间:2019-07-06 23:46:59

标签: java text-files overwrite

我正在开发一个游戏,所以我想使用这个神话名称的文本文件以程序方式生成银河系太阳系名称。

当我阅读文本文件时,我告诉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 个答案:

答案 0 :(得分:2)

摘自BufferedReader::readLine的文档:

  

返回:包含行内容的字符串,不包含任何行终止字符

因此,当您进入文件的这一部分时:

amor

&

它将读取空白行并去除换行符,剩下的只是一个空String。因此,它不会被您的if语句捕获:

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

您需要添加isEmpty()的支票

答案 1 :(得分:-1)

amor之后为空行。您正在尝试获取空行索引0处的字符。由于它是空行,因此显然没有字符,因此索引0处没有字符