提问人:Utkarsh Jain 提问时间:10/21/2023 更新时间:10/21/2023 访问量:60
线程“main”java.lang.ArrayIndexOutOfBoundsException 中的异常:索引 18 超出长度 18 的边界 [已关闭]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 18 out of bounds for length 18 [closed]
问:
class CSVFileParser {
ArrayList<String[]> convertCSVToArrayList(String filePath) {
String line = "";
ArrayList<String[]> rows = new ArrayList<>();
try {
BufferedReader br = new BufferedReader(new FileReader(filePath));
while ((line = br.readLine()) != null) {
String[] row = line.split(",");
rows.add(row);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return rows;
}
}
请帮我为什么它不起作用。当我尝试添加第 18 个索引时,这个错误来了,直到第 17 个它工作正常,任何人都为我修复了这个问题,我犯了错误
答:
1赞
John Bayko
10/21/2023
#1
评论有答案,但它们并不完全连贯。
String.split(",", limit)
将返回一个长度等于找到的字段数的数组(根据下面的注释进行了更正),因此如果有 17 个逗号,它将是一个索引为 [0] 至 [17]、长度为 18 的数组。如果为 0 或省略,则将省略末尾的任何空字段。文件delivery.csv具有包含 21 个字段的标题,但并非所有行的长度都相同。这是第一个问题,您应该指定预期限制,并且所有行都应该有 20 个逗号(任何短行的末尾都应该有空字段,例如“abc,def,qrs,tuv,,,”)。limit
limit
另一方面,您的软件也应该能够处理这样的错误。如果您使用为读取 CSV 文件而开发的包,则可能已经完成了。如果要以这种方式使用,则必须在尝试访问返回的数组之前检查返回数组的长度。split()
此外,您可能需要以其他方式验证 CSV 文件,它可能会省略中间的字段(例如,它可能有“abc,ghi”而不是“abc,,ghi”)。如果是这种情况,请尝试获取格式正确的文件,或者可能需要对特殊情况进行编码以更正这些问题。
此外,请确保文件中没有像“”或“”这样的数据中带有逗号的大小写。CSV 解析包可以处理这些情况,您将更难添加代码以始终正确处理这种情况。abc,"d,f",ghi
abc,d\,f,ghi
评论
0赞
user85421
10/21/2023
"String.split",")
将返回一个长度等于找到的字段数的数组“不完全正确 - 它不会在输入末尾返回空字段(例如 returns - 字符串有 4 个字段;3 个逗号;但生成的数组只有 2 个元素) ||documentation:“因此,尾随空字符串不包含在生成的数组中。"1,2,,".split(",")
String[2] { "1", "2" }
"
0赞
John Bayko
10/21/2023
我刚刚检查过,这取决于可选的参数。如果你将获得所有字段,但如果它是 0 或省略,你是对的,尾随的字段将被省略。这可能是最初问题的根源。limit
split(",", 20)
0赞
user85421
10/21/2023
顺便说一句,说到“不完全连贯”,该文件的标题中有 21 列 (A - U),而不是 20 列......只是说:-/
0赞
John Bayko
10/21/2023
好的,再加一个更正......
评论
line.split(",")
是解析 CSV 文件的完全不合适的方法。CSV 文件可以在双引号字符串中嵌入逗号,在其中使用转义双引号,甚至在其中使用换行符。使用适当的 CSV 库,例如 Apache Commons CSV。自己解析 CSV 文件是程序员总是认为他们可以拼凑在一起的事情之一,而且总是以眼泪告终。