Java使用split读取文件行中数字与字符串无输出问题求助
问题分析与修复方案
嘿,我来帮你捋捋这段代码的问题——你遇到的无输出情况,大概率是代码里的逻辑错误导致程序抛出异常或者根本没执行到输出环节,咱们一步步拆解:
几个核心问题
- 只读取了第一行就停滞:你一开始用
String s = reader.nextLine();读取了文件第一行,但后续的while(reader.hasNext())循环里再也没读取新行,split数组一直是第一行的内容;如果文件只有一行,reader.hasNext()会直接返回false,循环根本不执行,自然没输出。 - 数组索引越界:for循环条件写了
i <= grades.length,但数组索引从0开始,grades长度为6时合法索引是0-5,i=6时访问grades[6]会直接抛出ArrayIndexOutOfBoundsException,程序崩溃后就看不到任何输出。 - 数值类型精度丢失:
sum和avg都是int类型,但grades是double类型,把double值加到int变量里会自动截断小数,计算出的平均值完全不符合需求。 - 循环嵌套逻辑混乱:把for循环套在while里的逻辑完全错误——你应该是想逐行读取数据并存入数组,但当前写法会反复用第一行的内容覆盖整个数组,逻辑完全走偏。
修正后的代码
package com.company; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Main { public static void main(String[] args) throws FileNotFoundException { Scanner reader = new Scanner(new File("data.txt")); double[] grades = new double[6]; String[] names = new String[6]; int currentIndex = 0; // 跟踪数组的当前存储位置 double sum = 0.0; // 改用double类型避免精度丢失 // 逐行读取,直到文件读完或数组存满 while (reader.hasNextLine() && currentIndex < grades.length) { String line = reader.nextLine(); String[] splitContent = line.split(" "); // 确保每行格式正确(成绩+名字),避免数组越界 if (splitContent.length == 2) { grades[currentIndex] = Double.parseDouble(splitContent[0]); names[currentIndex] = splitContent[1]; sum += grades[currentIndex]; currentIndex++; } } // 计算并输出结果,处理无有效记录的情况 if (currentIndex > 0) { double average = sum / currentIndex; System.out.println("平均成绩: " + average); // 可选:打印所有读取到的记录 System.out.println("\n读取到的所有记录:"); for (int i = 0; i < currentIndex; i++) { System.out.println(names[i] + ": " + grades[i]); } } else { System.out.println("未读取到有效记录,请检查文件内容格式"); } reader.close(); // 记得关闭IO资源 } }
关键改动说明
- 把读取行的操作放到while循环内,每次循环读取新的一行,用
currentIndex跟踪数组存储位置,避免越界 - 将
sum和average改为double类型,保留成绩的小数精度 - 增加
splitContent.length == 2的判断,防止文件行格式错误导致的异常 - 处理了数组未存满的情况(比如文件只有3行数据),避免除以0的错误
- 最后关闭Scanner资源,养成良好的IO操作习惯
这样修改后,程序就能正确读取文件里的每行数据,计算平均成绩并输出啦!
内容的提问来源于stack exchange,提问作者moo cow
相关产品推荐
相关产品推荐

