明明数组未越界却抛出ArrayIndexOutOfBoundsException?求解答
问题分析与解决方案
首先咱们直接戳中核心:你测试的是格式完全合规的行,但程序运行时肯定碰到了格式异常的行(比如空行、只有1个字段的行),导致split后的数组长度不足2,访问str[1]时触发了数组越界异常。
为什么测试时没问题?
你用来测试的行是符合CSV格式的,分割后能得到至少2个元素,所以str[1]能正常访问。但实际的CSV文件里大概率存在这些情况:
- 空行(或者只有空格的无效行)
- 没有逗号的行(整个行就是一个独立字段)
- 逗号数量少于1个的行(分割后数组长度小于2)
当程序处理这些行时,split(",",7)得到的数组长度不够,这时候硬去访问str[1]就会直接抛出ArrayIndexOutOfBoundsException。
你的代码还有冗余逻辑
另外,你代码里的两个if(line.contains("PATRON"))和if(!line.contains("PATRON"))是完全互斥的,合并成if-else能减少冗余判断,让代码更清晰。
修复后的代码示例
给你调整后的代码,核心是先检查分割后的数组长度,再访问索引,同时处理空行和格式异常的行,还额外规避了后续可能触发的其他索引越界:
while((line = br.readLine()) != null) { // 先处理空行或全空白的行,避免后续分割出空数组 if (line.trim().isEmpty()) { pw.println(line); // 也可以选择跳过:continue; continue; } if(line.contains("PATRON")) { pw.println(line); } else { String[] str = line.split(",", 7); // 关键:先确保数组长度足够访问str[1] if (str.length >= 2) { if(str[1].equals(ID)) { // 额外检查:拼接时用到了str[2]和str[5],必须保证数组长度足够 if (str.length >= 6) { pw.println(str[0] + "," + ID + "," + str[2] + "," + "false" + "," + "0" + "," + str[5] + "," + "0"); } else { // 处理字段不足的行,比如写入原行或记录错误日志 pw.println(line); System.err.println("Line has insufficient fields for editing: " + line); } } else { pw.println(line); } } else { // 格式错误的行,直接写入原行或做其他处理 pw.println(line); System.err.println("Invalid line format, can't access index 1: " + line); } } }
额外小提醒
看你的调用代码里连续两次scan.nextLine():
case "7": System.out.println("Enter material ID: "); String matsid = scan.nextLine(); mats.returnmat(matsid); scan.nextLine(); break;
这可能会导致用户输入后需要多按一次回车,大概率是之前用了scan.nextInt()这类方法没处理换行符导致的,建议同步检查下输入逻辑,但这不是当前数组越界的直接原因。
内容的提问来源于stack exchange,提问作者Deviatenorm
相关产品推荐
相关产品推荐

