
怎么用 Scanner 安全读取用户输入而不卡死
控制台系统最常卡在输入环节——比如用户输了个字母,nextInt() 直接抛 InputMismatchException,后续所有 nextLine() 都读不到新内容。这不是 bug,是 Scanner 缓冲区残留换行符导致的。
- 永远优先用
nextLine()读字符串,再手动转类型(Integer.parseInt()),别混用nextInt()+nextLine() - 捕获
NumberFormatException比捕获InputMismatchException更直接,也更容易提示“请输入数字” - 读完每行后,别假设缓冲区干净;需要跳过残留时,加一句
scanner.nextLine()(但只在明确知道有残留时才加)
商品价格和数量怎么存才不会算错小数
用 float 或 double 存价格,迟早遇到 0.1 + 0.2 == 0.30000000000000004 这种问题。收银系统里,分是基本单位,必须精确。
- 价格统一用
int存“分”,比如 19.99 元存成1999;显示时再除以100.0格式化 - 如果非要显示带两位小数的字符串,用
String.format("%.2f", value),别用DecimalFormat(它受 locale 影响,中文环境可能输出逗号) - 计算总价、找零时全程用
long累加,避免溢出(万件商品 × 万元单价仍安全)
日报表怎么导出到文件又不被中文乱码搞崩
用 FileWriter 直接写中文,Windows 记事本打开大概率是乱码——因为默认用平台编码(GBK),而 Java 字符串是 UTF-16,中间没指定编码就隐式转了。
- 改用
OutputStreamWriter+FileOutputStream,显式指定"UTF-8"编码 - 文件名别含特殊符号(如
/、:),否则new File("2024-06-15_销售报表.txt")可能创建失败 - 报表内容按列对齐?别硬拼空格,用
String.format("%-10s %-8d %8d", name, count, amount)更稳
为什么每次重启程序商品数据就没了
控制台系统没数据库,但也不能把商品列表写死在代码里。硬编码 = 每改一次商品就得重编译,用户根本没法自己维护。
- 用纯文本配置:每行一个商品,格式如
苹果,500,850(名称,库存,单价分),启动时用Files.readAllLines(Paths.get("goods.txt"))加载 - 保存操作(如库存变动)必须同步写回文件,且要用
StandardOpenOption.WRITE+StandardOpenOption.CREATE,别用FileWriter覆盖——它会清空原文件再写,万一中途崩溃就丢数据 - 别忘了加
try-with-resources,否则文件句柄泄漏,跑两天就报IOException: Too many open files
真正麻烦的不是写功能,是让用户改配置时不手抖——比如多打个空格、少个逗号,解析时就 ArrayIndexOutOfBoundsException。得在加载逻辑里加字段校验,而不是等结账时报错才让用户回头翻文件。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











