
本文详解 java 中使用 scanner 读取整数文件时常见的逻辑错误,重点解决因重复调用 nextint() 导致的 nosuchelementexception 异常,并提供健壮、可复用的数值统计实现方案。
本文详解 java 中使用 scanner 读取整数文件时常见的逻辑错误,重点解决因重复调用 nextint() 导致的 nosuchelementexception 异常,并提供健壮、可复用的数值统计实现方案。
在 Java 文件处理中,一个高频陷阱是误将 Scanner.nextInt() 视为“获取值而不消耗输入流”的只读操作。实际上,每次调用 nextInt() 都会从输入流中读取并移除下一个整数 token。原代码在单次循环内三次调用 nextInt():
if (inputStream.nextInt() > max) { // 第1次:读取并丢弃该数(仅用于比较)
max = inputStream.nextInt(); // 第2次:读取下一个数赋给 max
}
sum = +inputStream.nextInt(); // 第3次:再读下一个数赋给 sum → 极易越界!
当文件只剩 1 个整数时,第一次 nextInt() 成功,但后续两次调用立即抛出 NoSuchElementException —— 这正是报错根源。
✅ 正确做法:每个循环仅调用一次 nextInt(),将结果存入局部变量再复用:
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String fileName = "scratch.txt";
Scanner inputStream = null;
try {
inputStream = new Scanner(new File(fileName));
} catch (FileNotFoundException e) {
System.out.println("The file: " + fileName + " has not been found, exiting program.");
System.exit(1);
}
int sum = 0;
int count = 0;
int max = Integer.MIN_VALUE; // 初始化为最小可能值,兼容负数
int min = Integer.MAX_VALUE; // 初始化为最大可能值
while (inputStream.hasNextInt()) {
int num = inputStream.nextInt(); // ✅ 关键:只读一次!
if (num > max) max = num;
if (num <p>? <strong>关键改进说明</strong>: </p>
-
单次读取,多次复用:
int num = inputStream.nextInt()确保每个整数被精确处理一次; -
安全初始化:
max = Integer.MIN_VALUE和min = Integer.MAX_VALUE保证任意输入(含负数)都能正确更新极值; -
空文件防护:添加
count == 0判断,避免sum / count除零异常及无意义输出; - 类型意识:平均值同时提供整数除法(截断)和浮点数格式化输出,提升实用性。
⚠️ 额外建议:
- 使用
try-with-resources自动关闭资源(更现代写法); - 若文件含非整数内容,可改用
hasNext()+next()+Integer.parseInt()并捕获NumberFormatException增强鲁棒性; - 对大数据量场景,考虑
BufferedReader+String.split()提升性能。
遵循“一次读取、变量复用”原则,即可彻底规避 NoSuchElementException,并构建出清晰、健壮的文件数值分析程序。










