当我尝试使用 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
amor之后是空行。您正在尝试获取空行索引 0 处的字符。因为它是一个空行,它显然没有字符,因此在索引 0
处没有字符
来自 BufferedReader::readLine
的文档:
Returns: A String containing the contents of the line, not including any line-termination characters
因此,当您到达文件的这一部分时:
amor
&
它会读取空行并去掉换行符,剩下的就是一个空String
。因此它不会被您的 if 语句捕获:
if (aLine.equals(String.valueOf(System.lineSeparator())))
您需要为 isEmpty()
添加支票
我正在开发一个游戏,我想使用这个神话名称的文本文件来程序生成星系太阳系名称。
当我阅读文本文件时,如果给定行上有不是名称的内容,我会告诉我正在使用的 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
amor之后是空行。您正在尝试获取空行索引 0 处的字符。因为它是一个空行,它显然没有字符,因此在索引 0
处没有字符来自 BufferedReader::readLine
的文档:
Returns: A String containing the contents of the line, not including any line-termination characters
因此,当您到达文件的这一部分时:
amor
&
它会读取空行并去掉换行符,剩下的就是一个空String
。因此它不会被您的 if 语句捕获:
if (aLine.equals(String.valueOf(System.lineSeparator())))
您需要为 isEmpty()