所以我有txt文件,其中包含有关人员的数据,并且与#34;;"分开:":
Person1;ABC;abc;123
Person2;DEF;def;456
我有类People,它有四个私有变量及其数据和相应的构造函数。
以下代码
try {
Scanner s = new Scanner(new File("People_data.txt"));
while (s.hasNextLine()) {
String[] split = s.nextLine().split(";");
// TODO: make sure the split has correct format
people.add(new People(split[0], split[1], split[2], split[3]));
}
} catch (FileNotFoundException ex) {
System.out.println("No file found");
Logger.getLogger(City.class.getName()).log(Level.SEVERE, null, ex);
}
返回java.lang.ArrayIndexOutOfBoundsException:3。现在在其他问题中存在一些类似的问题,但没有什么非常具体的答案。我试图从那些答案中修复代码,但是无法解决。我希望有人在这种情况下呈现修改后的工作代码,而不仅仅是陈述Java的问题。感谢。
答案 0 :(得分:1)
如果您的文件包含空行或您正在检索的数据行实际上并不包含所有数据,则会出现此问题。第一个很可能是导致你进退两难的原因,这也是为什么将你从文件中读到的内容放入String变量并至少进行一次有效性测试总是一个好主意....以确保它实际上包含数据。当您分割一个空行(最终为空字符串(“”)时,您的数组将只包含一个Null String元素,而不是您对People类所期望的4个元素,因此产生 ArrayIndexOutOfBoundsException 。您提供的索引在 split [] 数组中根本不存在。 (注意:我总是避免为变量名使用方法名称,这样可以减少混淆)
将您的代码设置为类似的内容,您很可能会很好:
try {
Scanner s = new Scanner(new File("People_data.txt"));
while (s.hasNextLine()) {
String line = s.nextLine();
// Make sure line is not blank...
if (!line.equals("")) {
String[] split = line.split(";");
// TODO: make sure the split has correct format
if (split.length == 4) {
people.add(new People(split[0], split[1], split[2], split[3]));
}
else {
// Do what you want if data is incomplete.
}
}
}
} catch (FileNotFoundException ex) {
System.out.println("No file found");
Logger.getLogger(City.class.getName()).log(Level.SEVERE, null, ex);
}
在上面的代码中,我们进行了两次特定的检查。首先,我们确保从文件读入的行实际上包含数据,然后再处理它。其次,在将split []数组应用于People之前,我们确保在split []数组中有足够的数据元素。