我试图通过从文本文件中读取数据来初始化类字段。示例文本文件如下所示:
Movies
Lord of the Rings: 180
Fight Club: 120
Theaters
A:100
B:50
C:200
Shows
1,1,960
1,1,1080
1,1,1200
1,3,1020
1,3,1140
2,2,990
2,2,1210
Prices
Adult:10
Child:7
Senior:8
End
以下是我的代码,它返回一个ArrayIndexOutOfBoundsException。
在此代码中,我尝试将文件“Movies”类别下的行解析为类字段,该字段是电影的数组列表。甲
电影的字段名称(字符串)和长度(字符串)。我通过在行中使用delmiter“:”分割行来尝试这个(以分割电影名称和长度编号)。
public static void inititializeFromFile(String fileName)
throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
while((line = reader.readLine()) != null) {
if(line.equals("Movies")) {
while (!(line.equals("Theaters"))) {
String currentline = line;
String[] parts = currentline.split(":");
String part1 = parts[0];
String part2 = parts[1];
movies.add(new Movie(part1, part2));
}
}
if(line.equals("Shows")) {
// do something
}
if(line.equals("Prices")) {
// do something
}
if(line.equals("Theaters")) {
// do something
}
if(line.equals("...")) {
// do something
}
else if(line.contains(":")) {
//do something
}
else if(line.equals("End")) {
// do something
}
else {
// anything else
}
}
reader.close();
}
}
我是BufferedReaders的新手,所以对于更好的方法的任何意见或建议都会受到赞赏。
答案 0 :(得分:1)
当您在电影下达到第二个while循环时,如果测试您的线仍然等于电影。你没有在if测试中阅读更多行。您实际上是在尝试"Movies".split(":")[1];
,这会让您的索引超出范围。
在第二个while循环中到达Movies字符串后,您应该阅读更多行。
if(line.equals("Movies")) {
while ((line = reader.readLine()) != null && !line.equals("Theaters")) {
String currentline = line;
String[] parts = currentline.split(":");
String part1 = parts[0];
String part2 = parts[1];
movies.add(new Movie(part1, part2));
}
}
编辑:很多时候处理文件时尤其如果你没有写文件,你可以有尾随空格,额外的新行和各种差异。这就是为什么我建议您使用System.out.println
轻松快速地观察您的程序流程。以下是我为此区域设置的方法
if(line.equals("Movies")) {
System.out.println("Hit Movies");
while ((line = reader.readLine()) != null && !line.equals("Theaters")) {
System.out.println("pasing ("+line+")");
String currentline = line;
String[] parts = currentline.split(":");
String part1 = parts[0];
String part2 = parts[1];
movies.add(new Movie(part1, part2));
}
System.out.println("Finished Movies");
}
如您所见,我在行输出"pasing ("+line+")"
周围加上括号。这让我有点不一致。剧院线上可能有一个尾随空间。您可能正在比较
"Theaters ".equals("Theaters")
。
您可以通过执行以下操作来解决此问题:!line.trim().equals("Theaters")
。
尾随空格,区分大小写,隐藏的ASCII字符都是解析世界中的问题。
答案 1 :(得分:0)
while((line = reader.readLine())!= null){
if(line.equals("Movies")) {
while (!(line.equals("Theaters"))) {
String currentline = line;
String[] parts = currentline.split(":");
String part1 = parts[0];
String part2 = parts[1];
movies.add(new Movie(part1, part2));
}
}
第一行代码,读取一行。第二行,什么都没读。三线没什么。第四行,currentLine = line
生成currentLine = Movie
因为您之后没有读过任何行。因此,您尝试将Movies
与不存在的:
分开,以便您可以使用索引0。索引1超出范围。
内部循环也应该读一行
while ((line = reader.readLine()) != null && !(line.equals("Theaters"))) {