使用HasNextLine()时Java while循环无法终止问题求助
问题分析与解决方案
首先,你的代码存在几个基础语法问题,先修正:
- main方法缺少返回类型
void,正确写法是public static void main(String[] args) result变量未声明,编译会报错,需要先定义(比如int result = 0;)
针对循环超时、空行无法终止的问题,给出以下解决办法:
1. 修正空行判断逻辑
当前input.isEmpty()仅识别完全无字符的空行,若输入行包含空格、制表符等空白字符,无法触发终止。改成以下判断:
if (input.trim().isEmpty()) { break; }
2. 避免hasNextLine()的阻塞超时
Scanner.hasNextLine()会持续阻塞等待输入,在在线判题(OJ)环境中,若输入无明确EOF或有固定行数,这种写法极易超时。建议先读取输入行数,再循环指定次数:
public static void main(String[] args) { Scanner s = new Scanner(System.in); int sum = 0; int result = 0; // 先读取总行数 int lineCount = s.nextInt(); s.nextLine(); // 读取换行符,避免干扰后续nextLine() for (int i = 0; i < lineCount; i++) { String input = s.nextLine(); // 处理业务逻辑 result += sum; } System.out.println(result); s.close(); }
3. 正确触发EOF终止循环
终端环境中触发EOF的方式:
- Linux/macOS:在新行开头按
Ctrl+D - Windows:在新行开头按
Ctrl+Z后回车
IDE运行时,不同工具触发方式不同(比如IntelliJ需按两次Ctrl+D)
4. 换用BufferedReader提升输入效率
Scanner处理大输入时效率偏低,易导致超时,改用BufferedReader可显著提速:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int sum = 0; int result = 0; String input; while ((input = br.readLine()) != null) { if (input.trim().isEmpty()) { break; } // 处理业务逻辑 result += sum; } System.out.println(result); br.close(); }
内容的提问来源于stack exchange,提问作者David Pascual
相关产品推荐
相关产品推荐

