应先用hasnextint()预检再调nextint(),失败时用next()清除非法输入;运算符用next().trim()获取后switch匹配;除零需提前检查;混用nextxxx()后须用nextline()清空换行符;double结果用string.format("%.2f", result)格式化输出。

Scanner读数字时遇到输入异常怎么处理
直接用 Scanner.nextInt() 读用户输入,一旦输了个字母或空格,程序就抛 InputMismatchException 崩掉。这不是“用户不守规矩”,而是 nextInt() 不会自动跳过非法输入,残留的错误字符还卡在缓冲区里,下次再调用还会撞上它。
- 先用
scanner.hasNextInt()预检,只在确认是整数时才调nextInt() - 如果检测失败,必须手动调
scanner.next()吃掉非法 token,否则缓冲区一直堵着 - 想支持小数?别硬套
nextInt(),改用hasNextDouble()+nextDouble(),但注意浮点精度问题不适合做等值判断
switch里怎么安全接住+−×÷四个运算符
switch 不能直接切字符串(Java 7之前),但你又不可能让用户输 1/2/3/4 来代表加减乘除——这反人类。Java 7 起支持 String 分支,但得确保输入是干净的单字符或标准符号串,不然 switch(" + ") 和 switch("+" ) 就对不上。
- 用
scanner.next().trim()拿运算符,去掉首尾空格 - case 写成
case "+":、case "-":这种明确字面量,别用变量或拼接结果 - 除零必须提前拦:在
case "/":分支里检查第二个数是否为 0,是则跳过计算并提示,不执行double result = num1 / num2;
为什么算完不退出、反而卡在下一轮输入
常见现象是:输完 “5 + 3” 得到结果 8,光标一跳,立刻又打印提示符等下一次输入,像没结束一样。其实不是死循环,而是 scanner.nextLine() 或混用 nextXXX() 留下的换行符没清掉,导致下一轮 nextLine() 直接读到空串。
- 统一用
nextLine()读所有输入(包括数字),再用Integer.parseInt()或Double.parseDouble()转——这样不会残留换行符 - 如果坚持用
nextInt(),每次之后必须补一句scanner.nextLine();吸走回车 - 别在 switch 外写 while(true),把循环控制逻辑放在最外层,每个完整计算流程走完再决定是否继续
double参与运算时输出带一堆小数位怎么办
比如 1.5 + 2.5 输出 4.000000000000001,不是 bug,是二进制浮点数表示局限。用户要的是“看起来像计算器”,不是 IEEE 754 精度报告。
立即学习“Java免费学习笔记(深入)”;
- 别用
System.out.println(result)直接打 double - 用
String.format("%.2f", result)控制最多两位小数(注意这是字符串,不是四舍五入数值) - 如果要做精确十进制计算(比如钱),必须换
BigDecimal,但控制台计算器一般没必要——用户输 1.1 + 2.2 本来就想看 3.3,不是 3.3000000000000003
真正麻烦的从来不是写完 switch 和 Scanner,而是用户随手敲个空格、多按个回车、或者输错符号后程序哑火——这些边界情况得挨个试一遍,而不是只跑通“2+2=4”这种理想路径。










