繁体   English   中英

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

[英]Why am I getting a StringIndexOutOfBoundsException when I try to skip multiple lines with BufferedReader?

我正在开发一个游戏,我想使用这个神话名称的文本文件来程序生成星系太阳系名称。

当我阅读文本文件时,我会告诉我正在使用的 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

来自BufferedReader::readLine的文档:

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

因此,当您到达文件的这一部分时:

amor

&

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

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

您需要添加检查isEmpty()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM