读取文件并分类数据到数组时遇数组越界问题求助
数组越界问题修正:按行数值分类存储文件数据
需求说明
- 将文件中包含3个数值的行存入
box二维数组(每行对应一个长度为3的子数组) - 将包含1个数值的行存入
ball一维数组 - 支持任意行数的文件输入
文件示例
2.0 5.0 3.5 5.2 0.5 4.8 1.0 2.5
原代码核心问题
- 数组初始化错误:每次循环重新创建数组,且长度依赖未正确递增的
lineNo,导致数组长度不足 - 索引越界:使用
lineNo作为数组索引(如box[lineNo][i]),超出数组实际长度范围;错误引用numbers[lineNo],应该按当前元素索引取值 - 行读取逻辑错误:
else块内的内层while会额外调用readLine(),导致部分行被跳过 - 数组类型误用:
ball应定义为一维数组(存储单个数值),而非二维数组
修正后的代码
import java.io.*; public class MainProg { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("info.txt"); BufferedReader br = new BufferedReader(fr); String line; // 第一次遍历:统计符合条件的行数,确定数组长度 int boxCount = 0; int ballCount = 0; while ((line = br.readLine()) != null) { String[] parts = line.trim().split("\\s+"); // 处理首尾空格和多空格分隔 if (parts.length == 3) { boxCount++; } else if (parts.length == 1) { ballCount++; } // 忽略数值数量不符合的行 } br.close(); // 初始化对应长度的数组 double[][] box = new double[boxCount][3]; double[] ball = new double[ballCount]; // 第二次遍历:填充数组 fr = new FileReader("info.txt"); br = new BufferedReader(fr); int boxIndex = 0; int ballIndex = 0; while ((line = br.readLine()) != null) { String[] parts = line.trim().split("\\s+"); if (parts.length == 3) { // 填充box数组的当前行 for (int i = 0; i < 3; i++) { box[boxIndex][i] = Double.parseDouble(parts[i]); } boxIndex++; } else if (parts.length == 1) { // 填充ball数组的当前元素 ball[ballIndex] = Double.parseDouble(parts[0]); ballIndex++; } } // 关闭资源 br.close(); fr.close(); // 测试输出验证结果 System.out.println("Box数组内容:"); for (double[] row : box) { System.out.printf("%.1f %.1f %.1f%n", row[0], row[1], row[2]); } System.out.println("\nBall数组内容:"); for (double num : ball) { System.out.printf("%.1f%n", num); } } }
修正要点说明
- 固定数组长度处理:Java数组长度不可动态调整,因此先遍历文件统计符合条件的行数,再初始化对应长度的数组
- 鲁棒的字符串分割:用
trim()清理行首尾空格,split("\\s+")支持多个空格分隔数值,避免分割出空元素 - 正确的索引管理:用
boxIndex和ballIndex分别跟踪两个数组的填充位置,确保每次赋值都在数组索引范围内 - 避免行遗漏:仅在外层循环读取每行,内层不再调用
readLine(),保证所有行都被处理 - 资源释放:每次文件操作后关闭流,避免资源泄漏
内容的提问来源于stack exchange,提问作者Gor Ik
相关产品推荐
相关产品推荐

