为何Java将3位小数输入转为Integer?其他位数小数却判定非法
为啥你的程序对3位小数“网开一面”?其实是Scanner的小把戏!
咱们先拆解一下你代码里nextInt()的真实行为——它可不是直接把输入的数字“砍掉小数转成int”,而是有一套固定的规则:
- 首先会跳过输入里的空格、换行这些空白字符
- 然后读取一个完整的“token”(简单说就是被空白符隔开的一串字符),再尝试把这个token转成int
- 如果这个token里有小数点、字母这类非数字字符,转不动了,就会抛出
InputMismatchException
你遇到的奇怪现象,大概率是输入时的空格位置搞的鬼:
- 要是你输入的是
123 .456(注意整数和小数点之间有空格):这时候nextInt()只拿第一个token123,转成int返回,程序自然会输出你的年龄。剩下的.456会留在输入缓冲区里,但你的程序没继续读它,所以你误以为程序“忽略了三位小数”。 - 但如果你输入的是
12.34或者1234.5678(整数和小数之间没空格):这一整串是一个token,nextInt()看到里面有小数点,知道转不成int,直接抛出异常,进入catch块输出错误提示,返回0,程序就不会输出年龄了。
当然还有一种小可能:你是不是把6位整数(比如123456)当成了“带三位小数的数值”?那nextInt()肯定能正常解析成int呀。
验证一下这个逻辑
你可以在代码里加几行,看看输入缓冲区里剩下的东西:
比如在main方法的输出语句后面加:
if (userInput.hasNext()) { System.out.println("输入缓冲区还剩:" + userInput.next()); }
运行后你就会发现:输入带空格的“整数+小数”时,剩下的小数部分会被打印出来;输入无空格的带小数点内容时,程序直接报错,不会走到这一步。
要是想严格只接受纯整数输入
如果你希望不管输入里有没有小数点,只要不是纯整数就判定非法,可以改成用nextLine()读整行,再手动解析:
public static int checkValidAge() { String input = userInput.nextLine().trim(); // 读整行并去掉前后空格 try { return Integer.parseInt(input); } catch (NumberFormatException e) { System.out.print("That isn't a whole number"); return 0; } }
这样不管是12.3还是123.456,只要不是纯整数,都会被判定为非法输入。
内容的提问来源于stack exchange,提问作者Matic
相关产品推荐
相关产品推荐

