第二次 nextline() 总是空,因为 nextint() 等不消费换行符,光标停在换行符上,nextline() 直接读到空字符串;应在其后加 scanner.nextline() 清除缓冲区或统一用 nextline() 配合 parsexxx() 转换。

用 Scanner 读取控制台输入时,为什么第二次 nextLine() 总是空?
因为 nextInt()、nextDouble() 等方法不消费换行符,光标停在换行符上,紧接着的 nextLine() 就直接读到空字符串。这不是 bug,是设计行为。
- 先用
nextInt()读数字后,加一行scanner.nextLine();吃掉残留换行符 - 或者统一用
nextLine()读所有输入,再用Integer.parseInt()或Double.parseDouble()转换 - 别混用
nextXXX()和nextLine(),尤其在循环里——容易漏清缓冲区
四则运算逻辑怎么避免除零和非法操作符?
不能等计算时才抛 ArithmeticException,得在解析阶段就拦截。用户输个 % 或 ^,程序不该崩溃,而要提示“不支持该运算符”。
- 用
switch (operator)明确列出'+'、'-'、'*'、'/'四种情况,default 分支 throw 新的IllegalArgumentException - 除法前判断
if (b == 0),提前报错,而不是依赖 JVM 抛ArithmeticException - 运算符变量类型必须是
char或String,别用int存符号再 switch —— 可读性差还易错
如何让计算器支持连续输入(比如 “3 + 4 * 2”)而不只是单步?
单步计算(两个数一个运算符)简单,但真想算表达式就得处理运算符优先级。手写递归下降太重,用现成方案更稳。
可编程序控制器,英文称Programmable Controller,简称PC。但由于PC容易和个人计算机(Personal Computer)混淆,故人们仍习惯地用PLC作为可编程序控制器的缩写。它是一个以微处理器为核心的数字运算操作的电子系统装置,专为在工业现场应用而设计,它采用可编程序的存储器,用以在其内部存储执行逻辑运算、顺序控制、定时/计数和算术运算等操作指令,并通过数字式或模拟式的输入、输出接口,控制各种类型的机械或生产过程。本平台提供PLC编程入门基础知识下载,需要的朋友们下载看看吧!
- 最轻量:用
javax.script.ScriptEngine(JDK 自带),调eval("3 + 4 * 2"),但仅限可信输入(有安全风险) - 稍可控:用
shunting-yard算法转后缀表达式,再计算——适合练手,但要注意括号和负号处理 - 实际项目中,建议直接引入
exp4j库,一行new ExpressionBuilder("3 + 4 * 2").build().evaluate()就完事
为什么用 double 而不是 float 做计算器数值类型?
float 精度只有 6~7 位有效数字,连 0.1f + 0.2f == 0.3f 都不成立;double 有 15~17 位,对控制台计算器够用,且 JVM 对 double 的优化更好。
立即学习“Java免费学习笔记(深入)”;
- 别用
float,除非你明确需要节省内存且接受更大误差 - 如果真要精确小数(比如财务场景),必须用
BigDecimal,但注意构造函数要用字符串:new BigDecimal("0.1"),别用new BigDecimal(0.1) - 输出时用
String.format("%.2f", result)控制小数位,避免打印出一长串无意义的 9999
控制台计算器看着简单,真正卡住人的从来不是算法,而是输入缓冲区那点残留字符、除零检查的位置、还有 double 和 BigDecimal 的选型边界——这些地方不试几次根本意识不到。









