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

Java Scanner.nextInt()未清换行符却无死循环的疑问

问题解答:为何输入小于6的数字不会触发死循环?

你的Java代码:

public static void main(String[] args){ Scanner scannner = new Scanner(System.in)
  int num = 0
  boolean isValid = false;
  while(!isValid){
    try{
       System.out.print("please input number:")
       inputedNum = scanner.nextInt()
       if(inputedNum < 6){
         throw new IllegalArgumentException("please input number more than 6")
       }
       isValid = true
     }catch(IllegalArgumentException e){
        System.out.print(e.getMessage())
     }catch(Exception e){
        System.out.print("please input number")
        scanner.nextLine()
     }
  }
}

问题:

原本我认为当输入小于6的数字时,由于scanner.nextLine()未清除换行符会进入死循环,但这段代码却能正常运行,想请教这是为什么?


解答:

核心原因是输入小于6的数字时,根本不会走到调用scanner.nextLine()的分支,且nextInt()的特性不会导致换行符残留引发死循环:

  • 当输入合法数字但小于6时,scanner.nextInt()会成功读取整数,此时数字后的换行符会留在输入缓冲区,但nextInt()本身会自动跳过前导空白字符(包括换行符),下一次循环调用nextInt()时,会直接跳过这个残留的换行符,等待新的输入。
  • 这段代码中,只有输入非数字内容(比如字母、符号)时,才会触发第二个catch(Exception)分支,此时才会调用scanner.nextLine()清除输入缓冲区里的无效内容和换行符,避免死循环。
  • 而输入小于6的数字只会触发IllegalArgumentException分支,这个分支里没有处理换行符的代码,但因为nextInt()的特性,下一次循环依然能正常读取新输入,所以不会出现死循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:37:06