system.out.println 是 java 基础输出方式,但存在缓冲未刷新、程序提前退出导致不显示、多线程输出交错等问题;print 无换行,println 自动换行并提升日志可解析性;生产环境应改用 slf4j 等专业日志框架。

System.out.println 是 Java 里最基础的控制台输出方式,但它不是万能的,也不是唯一该用的——尤其在调试、日志或性能敏感场景下,它容易埋坑。
为什么 println 有时不打印?
常见现象:代码执行了,但控制台没看到输出。这不是语法错,而是输出流没刷新或程序提前退出。
-
System.out默认是行缓冲的,但某些环境(如 IDE 的测试运行器、重定向输出时)可能不自动 flush,println虽然换行但未必立刻刷到终端 - 如果程序以
System.exit(0)结束,或者 main 方法末尾没等输出完成就退出,println可能被丢弃 - 在多线程中直接调用
println没问题,但若多个线程同时写,输出可能交错(比如两行内容混成一行)
print 和 println 的关键区别在哪?
只差一个换行符,但影响输出可读性和后续行为。
-
System.out.print("a"); System.out.print("b");输出ab(无换行,光标停在 b 后) -
System.out.println("a"); System.out.println("b");输出a\nb\n(每行独立,更利于日志解析) - 注意:
println(null)会输出字符串"null",不是空指针异常;但println(someString.toString())才真可能 NPE
什么时候不该用 println?
它适合学习、简单脚本或临时调试,但进真实项目就得换思路。
立即学习“Java免费学习笔记(深入)”;
- 生产环境打日志:用
slf4j+logback,支持级别控制、异步、文件滚动,println无法关闭或分级 - 需要格式化输出:比如
printf更安全(System.out.printf("%d %s", 42, "ok")),避免字符串拼接的 null 风险 - 高频输出(如循环内):
println每次都加锁+刷缓冲区,比StringBuilder缓存后一次性print慢几倍
真正麻烦的不是“怎么写”,而是“什么时候停用”——很多人直到线上日志满屏 println、排查问题时找不到关键上下文,才意识到它只是起点,不是终点。











