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

Java中Scanner的hasNext()方法为何等待输入而非返回false?

Scanner的hasNext()方法阻塞等待输入的原因及解决办法

为什么hasNext()不返回false反而阻塞?

  • Scanner的hasNext()方法本身就是这么设计的:当输入流里没找到下一个令牌时,它会一直等着,直到有新输入进来,或者输入流被关闭(也就是遇到EOF结束符)。
  • 用System.in(标准输入)的时候,这是个交互式的输入流,程序没法提前知道用户还会不会输入,所以hasNext()不会主动返回false,除非用户手动发结束信号——比如Linux/macOS按Ctrl+D,Windows按Ctrl+Z。

怎么判断输入缓冲区有没有现成内容?

要是不想让程序阻塞,又想检测当前有没有可读取的内容,可以用System.in.available()先判断:

import java.util.Scanner;
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        // 先查输入流里有没有可立即读取的字节
        if(System.in.available() > 0 && in.hasNext()){
            System.out.println("It has next");
        } else {
            System.out.println("It doesn't have next");
        }
        in.close();
    }
}
  • System.in.available()会返回当前输入缓冲区里能直接读的字节数,这个方法不会阻塞。如果返回值大于0,说明有内容,再调用hasNext()就不会卡着;不然直接判定没内容。
  • 注意:这种方式只能检测已经到缓冲区里的输入,用户还没输入的话,不会等,直接返回false。

额外说明

如果你的需求是循环读取用户输入,直到用户主动结束,那hasNext()的阻塞行为其实是正常的,比如下面这种写法:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            System.out.println("输入内容:" + in.next());
        }
        System.out.println("输入流已结束");
        in.close();
    }
}

内容的提问来源于stack exchange,提问作者Rachid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:37:36