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

Java 当我尝试使用BufferedReader跳过多行时,为什么会出现StringIndexOutOfBoundsException?,java,text-files,overwrite,Java,Text Files,Overwrite,我正在做一个游戏,我想用这个神话名字的文本文件来按程序生成银河系太阳系的名字 当我读取文本文件时,我会告诉while循环,如果给定行中有非名称的内容,我将使用它继续。这似乎在某些(并非所有)区域引发了一个异常,其中有多行没有名称 我如何使程序工作而不抛出异常或读取没有名字的行 我的代码: public class Rewrite { public static void main(String[] args) { loadFromFile(); } private static vo

我正在做一个游戏,我想用这个神话名字的文本文件来按程序生成银河系太阳系的名字

当我读取文本文件时,我会告诉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)
引发的异常:

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”后引发错误


amor后面是一个空行。您试图获取空行索引0处的字符。由于它是一个空行,显然没有字符,因此索引0处没有来自以下文档的字符:

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

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

amor

&

它将读取空白行并删除断线字符,剩下的将是空的<代码>字符串< /代码>。因此,它不会被您的if声明捕获:

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

您需要添加一个检查
isEmpty()

它是否仍然具有换行符?我告诉循环继续执行这些操作。@LuminousNutria
readLine()
在读取时丢弃换行符,因此当有空格时,它将是一个空的
字符串
:返回:一个包含行内容的字符串,不包括任何行终止字符(来自文档)您需要添加一个
isEmpty()
check@GBlodgett真管用!非常感谢。你知道它为什么在我的文本文件样本中“Aron”之后使用吗?@ LuminousNutria有一个<代码>(< /代码>字符,所以在部分<代码>中,如果(Aln.StastSub(”(”)){Aln= BR.RealLoad();继续;}它完全跳过空白行。(<代码> Aln= BR.RealLoad()将捕获空<代码>字符串< /代码>,然后在while循环的条件下,它将读取另一行,有效地跳过空白行)