System.exit(0) 是 Java 中强制终止 JVM 进程的直接方式,立即停止所有线程、执行 shutdown hooks 后以状态码退出;状态码 0 表示成功,非 0 表示错误,超出 255 则取模;调用后后续代码(含 finally)不执行,Web 环境中可能被禁止;应优先考虑自然退出。
system.exit(0) 是 java 中强制终止当前 jvm 进程的最直接方式,它会立即停止所有线程(包括非守护线程)、执行已注册的 shutdown hooks,然后以指定状态码退出进程。
退出状态码的含义与约定
状态码是一个 0–255 的整数:
- 0 表示程序成功结束(惯例,不是强制)
- 非 0 值(如 1、2、127) 通常表示异常或错误退出,具体含义由程序自行定义
- 超出 255 的值会被自动截断为
status % 256(例如System.exit(300)实际返回 44)
基本用法与注意事项
调用非常简单:
System.exit(0); // 正常退出 System.exit(1); // 自定义错误退出 System.exit(-1); // 等价于 System.exit(255),因负数会按补码取模
但需注意:
- 一旦执行,JVM 立即开始关闭流程,后续代码(包括
finally块)**不会执行**(除非在 shutdown hook 中) - 静态初始化块、构造器、普通方法中均可调用,但应避免在库代码中随意使用,以免破坏调用方控制流
- 在 Web 应用(如 Tomcat)或容器环境中,
System.exit可能被安全管理器禁止,抛出SecurityException
配合 shutdown hook 实现优雅清理
若需在退出前释放资源(如关闭文件、发送日志),可注册 shutdown hook:
立即学习“Java免费学习笔记(深入)”;
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("正在清理资源...");
// 关闭数据库连接、写入临时状态等
}));
该线程会在 System.exit() 触发后、JVM 真正退出前运行。注意:
- shutdown hook 中不能再调用
System.exit(),否则会导致死锁或未定义行为 - 不保证执行顺序,多个 hook 并发执行,需自行处理线程安全
- 无法捕获
kill -9这类强制信号,仅响应正常终止信号(如kill -15)和System.exit()
替代方案:优先考虑自然退出
多数情况下,更推荐让 main 方法自然结束,或通过控制循环变量退出:
- 主线程结束 + 所有非守护线程终止 → JVM 自动退出(状态码 0)
- 在命令行工具中,可用
return或抛出RuntimeException后捕获并调用System.exit()统一处理 - 避免在多线程服务中误用
System.exit(),否则可能意外终止整个应用


















