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
相关产品推荐
相关产品推荐

