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

Java读取txt指定索引数据插入ArrayList编译报错解决方案

报错根因

两个编译报错都是数组用法和API入参不匹配导致的:

  • 第一个.class expected报错:Java访问数组元素时,方括号[]内必须填写要访问的元素索引,空写score1[]属于非法语法,编译器会误判你在获取数组类的class对象,直接抛出语法错误。
  • 第二个类型不匹配报错:Double.parseDouble()方法只接受单个字符串作为入参,你直接传入整个score1(类型是String[]字符串数组),和方法要求的入参类型完全不符。

除此之外你的代码还有3处明显逻辑错误:

  • 括号嵌套完全错位:读文件的while循环、GUI初始化代码的作用域混乱,bufReader.close()的位置和方法括号不匹配,会直接导致编译失败。
  • GUI创建代码放在了读文件的循环内部,会导致每读一行文件就新建一个JFrame窗口,完全不符合预期。
  • 没有做数据合法性校验:如果某行文本按逗号分割后不足4个元素、或者索引3位置的内容不是合法数字,直接转换/访问会触发运行时崩溃。另外你写的for循环会把同一个BMI值重复添加13次,属于笔误逻辑,和「读取文件中多组BMI数据绘图」的需求不符。
修复实现

核心逻辑是逐行读取文件、按逗号分割后,直接取索引为3的单个字符串做去空格处理、转成Double存入列表,等所有数据读取完成后再初始化GUI,同时用try-with-resources自动管理文件流,不需要手动写close逻辑避免资源泄漏。
修复后的可运行代码如下:

private static void showgui() {
    // try-with-resources语法会在代码块执行完后自动关闭文件流
    try (BufferedReader bufReader = new BufferedReader(new FileReader("bmidata.txt"))) {
        List<Double> scores = new ArrayList<>();
        String line;
        // 逐行遍历文件内容
        while ((line = bufReader.readLine()) != null) {
            String[] lineParts = line.split(",");
            // 先校验当前行分割后长度足够,避免数组越界
            if (lineParts.length >= 4) {
                try {
                    // 取索引3的元素,去掉首尾空白字符后转成double存入列表
                    double bmiVal = Double.parseDouble(lineParts[3].trim());
                    scores.add(bmiVal);
                } catch (NumberFormatException e) {
                    // 某行数据格式不对时打印错误,跳过该行不中断整个程序
                    System.err.println("跳过格式错误的行:" + line);
                }
            }
        }

        // 所有数据读取完成后再初始化GUI,不要放在读文件循环里
        int maxDataPoints = 13;
        // 最多取前13条数据用于绘图,避免数据量过大超出展示范围
        List<Double> displayData = scores.size() > maxDataPoints 
                ? scores.subList(0, maxDataPoints) 
                : scores;
        
        MainPanel mainPanel = new MainPanel(displayData);
        mainPanel.setPreferredSize(new Dimension(800, 600));
        
        JFrame frame = new JFrame("Body Mass Index");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    } catch (IOException e) {
        // 处理文件不存在、读文件失败的异常
        e.printStackTrace();
    }
}

如果你确实需要把单个值重复添加13次做测试,只需要在拿到bmiVal后写循环add即可,但常规BMI趋势图是按文件中存储的多条记录顺序展示的。

内容的提问来源于stack exchange,提问作者pakupaku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 11:06:33