You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取文件并分类数据到数组时遇数组越界问题求助

数组越界问题修正:按行数值分类存储文件数据

需求说明

  • 将文件中包含3个数值的行存入box二维数组(每行对应一个长度为3的子数组)
  • 将包含1个数值的行存入ball一维数组
  • 支持任意行数的文件输入

文件示例

2.0 5.0 3.5
5.2 0.5 4.8
1.0
2.5

原代码核心问题

  1. 数组初始化错误:每次循环重新创建数组,且长度依赖未正确递增的lineNo,导致数组长度不足
  2. 索引越界:使用lineNo作为数组索引(如box[lineNo][i]),超出数组实际长度范围;错误引用numbers[lineNo],应该按当前元素索引取值
  3. 行读取逻辑错误:else块内的内层while会额外调用readLine(),导致部分行被跳过
  4. 数组类型误用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:25:13