You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:42:38