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
相关产品推荐
相关产品推荐

