System.out.printf默认不换行,因它不自动添加换行符,需显式在格式串末尾加\n或%n;类型错配(如%d配String)会抛IllegalFormatConversionException;%.2f等修饰符可控制精度与对齐。

为什么 System.out.printf 有时不换行?
因为 printf 默认不自动追加换行符,和 println 不同。如果输出后光标卡在行尾、下一条输出紧贴着上一条,大概率是忘了加 \n。
实操建议:
- 显式在格式串末尾加
\n,例如:System.out.printf("Name: %s, Age: %d\n", name, age); - 需要换行但不想写
\n?改用System.out.format(...)(行为一致)或直接拼println,但后者失去格式控制能力 - 调试时可临时补一句
System.out.println("—");快速确认是否真没换行
%d、%s、%f 这些占位符怎么选?
类型错配会导致 IllegalFormatConversionException,比如用 %d 去格式化 String。
常用对应关系:
-
%d→int、long等整数类型(注意:byte、short会自动提升,可用;BigInteger不行) -
%s→ 任意对象(调用.toString(),null输出为字符串"null") -
%f→float、double(BigDecimal需用%e或%g,否则抛异常) -
%c→char或int(表示 Unicode 码点),别误用成String
如何控制小数位数和对齐?
单纯写 %f 会输出 6 位小数且左端空格填充,往往不符合需求。精度和宽度要靠修饰符组合。
典型写法示例:
- 保留 2 位小数:
%.2f(如3.14159→"3.14") - 总宽 8 字符、右对齐、2 位小数:
%8.2f(不足补空格) - 总宽 8、左对齐、2 位小数:
%-8.2f(减号表示左对齐) - 补零而非空格:
%08.2f(输出"00003.14") - 科学计数法:
%e,自动精度是 6 位有效数字,也可写成%.3e
中文乱码或特殊字符显示异常怎么办?
这通常不是 printf 的问题,而是终端/IDE 的字符编码与 JVM 启动编码不一致。Windows CMD 默认是 GBK,而 Java 源文件多为 UTF-8。
验证与解决路径:
- 先确认源码保存编码:IDEA 中看右下角,VS Code 看右下角状态栏,确保是 UTF-8
- 运行时加 JVM 参数强制编码:
-Dfile.encoding=UTF-8(IDE 运行配置里加到 VM options) - 命令行运行时,Windows 下可先执行
chcp 65001切到 UTF-8 模式(需系统支持) - 避免在格式串里硬编码非 ASCII 字符,改用 Unicode 转义,例如
"\u4f60\u597d"替代"你好",减少编码依赖
真正麻烦的是跨平台部署时终端不可控——这时候不如把格式化结果先存进 String,再交给更可靠的日志组件或 UI 层处理。

















