Java控制台输入输出高级格式化需精准控制样式并规避陷阱:Scanner输入要处理换行残留,推荐统一用nextLine()转类型;printf需掌握宽度、精度等修饰符组合;数值舍入依场景选Math.round或BigDecimal;System.err专用于异常输出且实时刷新。

Java 控制台输入输出的高级格式化,核心在于精准控制数据呈现样式和避免常见陷阱。不是简单拼接字符串,而是用对工具、选对方法、配对参数。
Scanner 输入要注意换行残留问题
很多新手在连续调用 nextInt() 后接 nextLine() 会“跳过”输入,本质是 nextInt() 不读取回车符,导致 nextLine() 立即读到空行。
- 解决办法:在
nextInt()、nextDouble()等之后手动加一句sc.nextLine();消耗掉残留换行符 - 更稳妥做法:统一用
nextLine()读入,再用Integer.parseInt()或Double.parseDouble()转换,可配合try-catch处理非法输入 - 别忘了关闭 Scanner(尤其在 try-with-resources 中更安全):
scanner.close();
printf 格式化输出要掌握占位符组合逻辑
System.out.printf() 的真正威力不在单个 %d 或 %s,而在修饰符叠加——宽度、精度、对齐、补零、千分位一个都不能少。
-
%10.2f:总宽 10 字符,保留 2 位小数,右对齐(不足左补空格) -
%-10s:字符串左对齐,固定占 10 位 -
%08d:整数不足 8 位时,前面补 0(如123→00000123) -
%,.2f:自动添加本地化千位分隔符(如1234567.89→1,234,567.89) -
%+d:强制显示正负号(+123、-45)
保留小数不能只靠 printf,要分场景选方案
如果目标是计算后四舍五入并存为数值,printf 只是“显示”,不改变原始值;需要真截断或取整,得用数学方法。
立即学习“Java免费学习笔记(深入)”;
- 仅用于打印:直接
%.2f最简洁 - 需参与后续运算且必须是两位小数:用
Math.round(x * 100.0) / 100.0 - 要求严格银行式舍入(如 0.5 向偶数舍):用
BigDecimal配合RoundingMode.HALF_EVEN - 要格式化成字符串(如金额显示):
String.format("%.2f", x)或DecimalFormat(注意线程不安全)
错误输出与日志要区分对待
别把 System.err 当成“另一个 System.out”。它是专为异常和警告设计的独立流,终端里常显示为红色,且默认不缓冲——出错信息能立刻刷出,不被正常输出延迟。
- 业务逻辑失败提示(如“用户名不存在”):走
System.out - 系统级异常、配置缺失、IO 错误:用
System.err.println("Failed to load config") - 调试时可临时重定向:
System.setErr(new PrintStream("error.log"))


















