Java读取CSV文件触发ArrayIndexOutOfBoundsException异常求助
解决CSV读取时的数组越界异常
先帮你梳理下代码里导致ArrayIndexOutOfBoundsException的几个关键问题,以及对应的修复方案:
1. 二维数组维度完全搞反了
你提到CSV有58列、859行,但你定义的数组是new double[58][859]——Java里二维数组的第一个参数是行数,第二个是列数。这意味着你现在的数组只能容纳58行、859列,和实际数据结构完全相反,当读取到第59行时,自然会触发行索引越界。
修复:把数组定义改成符合实际数据的结构:
myArray = new double[859][58]; // 859行,58列
2. 没有读取CSV的行内容
你的循环逻辑有个致命疏漏:while (scanIn.hasNextLine())判断存在下一行,但从来没调用scanIn.nextLine()把行内容赋值给InputLine。这导致InputLine一直是空字符串,split(",")后得到的数组要么为空,要么只有空元素,循环会无意义地执行直到Rowc超过数组行上限,直接触发越界。
修复:在循环开头读取当前行内容:
while (scanIn.hasNextLine()) { InputLine = scanIn.nextLine(); // 先读取当前行内容 String[] InArray = InputLine.split(","); // 后续处理逻辑... }
3. 字符串比较误用==而非equals()
Java中比较字符串内容不能用==,==比较的是对象引用地址,应该用equals()方法。你这里判断InArray[x]=="nan"会永远匹配不到目标字符串,进而尝试把"nan"转为Double,触发NumberFormatException。
修复:修改判断条件:
if (InArray[x].isEmpty() || InArray[x].equals("nan")){ myArray[Rowc][x] = -1; } else { myArray[Rowc][x] = Double.parseDouble(InArray[x]); }
4. 额外的健壮性优化
为避免CSV行的列数和预期不一致导致的列索引越界,建议处理前先限制循环的列数:
int colsToProcess = Math.min(InArray.length, 58); for (int x=0; x<colsToProcess; x++) { // 处理逻辑... }
修复后的完整代码示例
import java.io.BufferedReader; import java.io.FileReader; import java.util.Scanner; public class CsvLoader { // 修正类名,符合Java命名规范 static double[][] myArray; static double[][] setUpArray() { myArray = new double[859][58]; // 修正维度:859行,58列 Scanner scanIn = null; int rowCount = 0; String inputLine = ""; String fileLocation = "/location/myCSVfile.csv"; try { scanIn = new Scanner(new BufferedReader(new FileReader(fileLocation))); // 限制行数,避免超出数组容量 while (scanIn.hasNextLine() && rowCount < 859) { inputLine = scanIn.nextLine(); // 读取当前行 String[] inArray = inputLine.split(","); int colsToProcess = Math.min(inArray.length, 58); for (int x = 0; x < colsToProcess; x++) { if (inArray[x].isEmpty() || inArray[x].equals("nan")) { myArray[rowCount][x] = -1; } else { // 捕获无法转成Double的异常值 try { myArray[rowCount][x] = Double.parseDouble(inArray[x]); } catch (NumberFormatException e) { myArray[rowCount][x] = -1; } } } rowCount++; } } catch (Exception e) { e.printStackTrace(); // 打印完整栈轨迹,方便调试 } finally { if (scanIn != null) { scanIn.close(); // 关闭资源,避免内存泄漏 } } return myArray; } public static void main(String[] args) { double[][] result = setUpArray(); // 打印前5行前5列数据验证结果 for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print(result[i][j] + " "); } System.out.println(); } } }
补充说明:Java数组索引从0开始,长度为N的数组最大索引是N-1——这也是你之前盲目扩大数组仍报错的核心原因,因为数组维度本身就搞反了,调整维度才是解决问题的根本。
内容的提问来源于stack exchange,提问作者wigglywinks
相关产品推荐
相关产品推荐

