我正在从文本文件中读取,使用String.split(“,”)方法(我使用逗号)拆分行,然后对数据进行处理。我遇到了麻烦......我得到了一个ArrayIndexOutOfBoundsException。
这是我文件的前两行:
1,,1,Male Slave,,1,1,
2,yes,1,Bronze Cooking Pot,,,,
我的代码:
try {
File file = new File("/Accounts/changy/Desktop/GreekProject/data.txt");
Scanner sc = new Scanner(file);
sc.nextLine();
while (sc.hasNextLine()) {
String line = sc.nextLine();
String[] splitArray = line.split(",{1}");
System.out.println(splitArray.length);
System.out.println(splitArray[0] + "\t" + splitArray[1] + "\t" + splitArray[2]+ "\t" + splitArray[3]+ "\t" + splitArray[4]);
}
}
catch (NullPointerException e) {
System.out.println("NPE!!");
}
catch (FileNotFoundException e) {
System.out.println("FNFE!!");
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("AIOOBE!!")
}
所以,如果我省略splitArray [4],代码运行完全正常。我甚至尝试在行尾添加额外的逗号,这没有用。数组的长度是7,所以对我来说第五个条目是空的没有任何意义...任何帮助都将非常感激。
答案 0 :(得分:3)
String.split
默默地丢弃尾随分隔符。 (这是其众多问题之一。)IIRC,您应该使用line.split(",{1}", -1);
获得所需的行为。
答案 1 :(得分:3)
只有一个参数的split
方法的版本会在返回给你之前修剪数组末尾的所有空标记字符串,因此第二行将生成一个长度仅为4的数组。
使用two-argument version of split
,使用负limit
,这样它就不会修剪数组中的尾随空字符串,并且所有预期的元素都会在那里。
String[] splitArray = line.split(",{1}", -1);
从链接的Javadocs引用:
如果n是非正数,那么模式将被应用多次 可能,阵列可以有任何长度。如果n为零,那么 模式将尽可能多地应用,数组可以有 任何长度,尾随空字符串都将被丢弃。
此处,当他们引用n
时,他们实际上指的是limit
(第二个参数)。