Java实现带头部数字序列平均值计算遇NoSuchElementException报错问题
问题排查与修复方案
问题根因
三个异常表现的核心诱因是Scanner读取逻辑不匹配:
- 循环判断用
sc.hasNextLine(),但循环内使用sc.nextInt()读取数据,两者的校验逻辑不一致:nextInt()只会读取整数内容,会跳过空格、换行符等分隔符,不会消费行尾的换行符。当所有有效数字读取完成后,文件末尾残留的换行符会让hasNextLine()返回true,程序进入循环后调用sc.nextInt()找不到有效整数,直接抛出java.util.NoSuchElementException异常。 - 异常抛出后程序直接终止,导致后续打印序列总数的代码未执行,同时85.0后的换行还未输出到控制台,对应出现前两个问题。
修复方案
核心修改点:
- 将循环条件替换为
sc.hasNextInt(),和nextInt()的读取逻辑匹配,只有存在有效整数时才进入循环,避免空读取抛出异常。 - 将打印平均值的
System.out.print替换为System.out.println,自动输出系统兼容的换行符,规避手动写\n的适配问题。 - 新增Scanner资源关闭逻辑,避免资源泄漏。
修正后代码:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class NumAverageCalc { public static void main(String[] args) throws FileNotFoundException { Scanner sc = new Scanner(new File("numbers.text")); int count = 0; // 改用hasNextInt匹配nextInt读取逻辑 while (sc.hasNextInt()) { int n = sc.nextInt(); double total = 0; System.out.print("The average of the " + n + " integers "); for (int i = 0; i < n; i++) { int x = sc.nextInt(); System.out.print(x + " "); total += x; } double avg = total / n; // println自动添加换行 System.out.println("is " + avg); count++; } System.out.println(count + " sets of numbers processed"); sc.close(); } }
内容的提问来源于stack exchange,提问作者swu
相关产品推荐
相关产品推荐

