
nosuchelementexception 常因在 scanner 无有效输入时调用 nextline() 等方法引发,尤其在算法评测平台(如 eof 输入终止场景)中高频出现;正确做法是使用 hasnext() 或 hasnextline() 预检输入有效性,并复用 scanner 实例。
在 Java 算法题或在线判题系统(如 Baekjoon、LeetCode 终端环境、自定义 OJ)中,NoSuchElementException 是一个典型且易被忽视的运行时异常。它并非源于逻辑错误,而是输入流提前耗尽后仍尝试读取所致——例如评测系统以 EOF(End-of-File)方式结束输入(Linux 下 Ctrl+D,Windows 下 Ctrl+Z),而非显式输入 "END" 字符串。
你原代码的问题在于:
- 每次循环都新建 Scanner scan = new Scanner(System.in),不仅低效,更会导致底层 System.in 流状态混乱;
- 直接调用 scan.nextLine() 而未校验输入是否可用,一旦遇到 EOF,nextLine() 立即抛出 NoSuchElementException,程序崩溃。
✅ 正确解法是:复用 Scanner 实例 + 输入存在性预检。推荐使用 hasNextLine()(语义更精准)或 hasNext()(对纯文本输入亦适用):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNextLine()) { // ✅ 安全检测:有下一行才进入循环
String str = scan.nextLine();
if ("END".equals(str)) { // ⚠️ 建议用 "END".equals(str) 避免空指针
break;
}
// 反转字符串并输出
for (int i = str.length() - 1; i >= 0; i--) {
System.out.print(str.charAt(i));
}
System.out.println();
}
scan.close(); // ✅ 良好实践:显式关闭资源(虽 System.in 关闭无副作用,但养成习惯)
}
}? 关键注意事项:
Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。
立即学习“Java免费学习笔记(深入)”;
- 永远不要在循环内重复创建 Scanner(System.in):System.in 是单例输入流,频繁构造 Scanner 可能导致缓冲区错位或资源泄漏;
- 优先使用 hasNextLine() 而非 hasNext():前者严格匹配“一行文本”,后者可能因分隔符行为产生意外匹配;
- 字符串比较用 "END".equals(str):避免 str 为 null 时触发 NullPointerException(尽管 nextLine() 在 EOF 时抛异常而非返回 null,但属防御性编程最佳实践);
- 本地测试模拟 EOF:在终端执行 echo -e "Hello\nWorld\nEND" | java Main 或 java Main
该方案确保程序在真实评测环境中鲁棒运行——无论输入以 "END" 显式结束,还是以 EOF 隐式结束,均不会抛出 NoSuchElementException,同时准确完成句子反转任务。









