
本文详解如何使用 Scanner 安全读取固定长度的非负整数序列,重点解决因 hasNext() 误用导致的无限循环问题,并确保输入数量、范围与单调性校验全部到位。
本文详解如何使用 scanner 安全读取固定长度的非负整数序列,重点解决因 `hasnext()` 误用导致的无限循环问题,并确保输入数量、范围与单调性校验全部到位。
在 Java 中,使用 Scanner 读取用户输入时,若未对输入边界和终止条件做严格控制,极易陷入无限循环——尤其当程序预期读取精确 N 个整数,却依赖 scan.hasNext() 这类“等待任意后续输入”的判断逻辑时。原始代码中 while (scan.hasNext()) 会持续阻塞等待输入,即使已读满 N 个数,只要标准输入流未关闭(如终端未按 Ctrl+D/Ctrl+Z),循环永不退出;同时,数组索引 k 未同步递增、越界访问风险(inputs[k] 在 k >= n 时崩溃)及逻辑错误(如 ordinary_order 未声明)进一步加剧问题。
以下是符合需求的健壮实现:
import java.util.Scanner;
public class Sequ {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 第一步:读取数字个数 n
if (!scan.hasNextInt()) {
System.out.println("Error: First input must be an integer.");
return;
}
int n = scan.nextInt();
// 校验 n 的合法性
if (n <= 0) {
System.out.println("Invalid input: number count must be positive.");
return;
}
// 初始化数组
int[] inputs = new int[n];
int numInputs = 0; // 实际成功读取的数字个数
// 第二步:精确读取 n 个非负整数,带完整校验
while (numInputs < n && scan.hasNext()) {
if (!scan.hasNextInt()) {
System.out.println("Error: Expected integer at position " + (numInputs + 1) + ".");
return;
}
int val = scan.nextInt();
if (val < 0) {
System.out.println("Error: All numbers must be non-negative.");
return;
}
inputs[numInputs] = val;
numInputs++;
// 检查是否满足严格递增(题目隐含要求:后一个 ≤ 前一个即报错)
if (numInputs >= 2 && inputs[numInputs - 1] <= inputs[numInputs - 2]) {
System.out.println("Input numbers not in strictly increasing order.");
return;
}
}
// 第三步:终态校验 —— 是否真的读满了 n 个?
if (numInputs < n) {
System.out.println("Incomplete input: expected " + n + " numbers, got only " + numInputs + ".");
return;
}
// ✅ 成功完成所有校验
System.out.println("Valid input sequence received: " + java.util.Arrays.toString(inputs));
}
}关键改进说明:
- ✅ 双重终止条件:while (numInputs < n && scan.hasNext()) 确保循环在读满 n 个数或输入流结束时必然退出,彻底规避无限等待;
- ✅ 前置类型检查:每次读取前用 hasNextInt() 防止 nextInt() 抛出 InputMismatchException;
- ✅ 索引安全:用独立计数器 numInputs 控制数组写入位置,杜绝越界;
- ✅ 即时失败反馈:任何校验失败(负数、非整数、非递增、数量不足)均立即打印明确错误并 return,不继续执行;
- ✅ 语义清晰:变量名(如 numInputs)和错误信息直指问题本质,便于调试与维护。
运行示例:
立即学习“Java免费学习笔记(深入)”;
输入: 4 2 4 5 6 输出: Valid input sequence received: [2, 4, 5, 6] 输入: 3 1 1 2 输出: Input numbers not in strictly increasing order.
遵循此模式,即可在保证功能正确性的同时,大幅提升程序的鲁棒性与可维护性。










