system.exit(int status) 是 java 终止 jvm 并返回操作系统状态码的标准方式,0 表示成功,非 0(1–127)表示特定错误,应避免使用 128+ 和负数;建议用常量类定义语义化退出码并在 shell 中捕获处理。

System.exit(int status) 是 Java 中终止 JVM 的标准方式,它会向操作系统返回一个整数状态码(通常称为 exit code),父进程(比如 Shell 脚本、CI 工具、服务管理器等)可以通过这个状态码判断 Java 程序是否成功完成、发生了何种错误。
常用状态码约定
POSIX 和大多数脚本环境遵循如下惯例:
- 0:表示成功(success)——这是最广泛认可的“一切正常”信号;
- 非 0 值(1–127):表示失败或特定异常情况,具体含义由程序自行定义;
- 128+ 的值:通常被系统保留(如 128 + signal number 表示被信号终止),Java 应避免使用;
-
负数:JVM 会将其自动转为无符号字节(即对 256 取模),例如
System.exit(-1)实际返回255,不推荐,易引发歧义。
在代码中按结果类型传递不同状态码
根据业务逻辑分支,用有意义的整数区分结果:
- 处理成功 →
System.exit(0); - 参数错误(如缺失必需参数)→
System.exit(1); - 配置文件读取失败 →
System.exit(2); - 数据库连接异常 →
System.exit(3); - 网络请求超时 →
System.exit(4); - 自定义错误类型可继续递增,但建议在文档或常量类中明确定义,例如:
public class ExitCode {
public static final int SUCCESS = 0;
public static final int INVALID_ARGS = 1;
public static final int CONFIG_ERROR = 2;
public static final int DB_FAILURE = 3;
}
然后在逻辑中调用:System.exit(ExitCode.DB_FAILURE);
Shell 脚本中捕获并响应状态码
执行 Java 程序后,立即检查 $? 变量即可获取退出码:
java -jar myapp.jar exit_code=$? case $exit_code in 0) echo "运行成功" ;; 1) echo "参数错误,请检查输入" ;; 2) echo "配置加载失败" ;; 3) echo "数据库不可用" ;; *) echo "未知错误,退出码: $exit_code" ;; esac
也可用于条件控制,比如只在成功时继续后续步骤:
if java -jar myapp.jar; then echo "继续部署..." ./deploy.sh else echo "构建失败,中止流程" exit 1 fi
注意事项与最佳实践
- 不要在 finally 块或 shutdown hook 中调用
System.exit(),可能干扰资源清理; - 确保所有异常路径都明确设置 exit code,避免未捕获异常导致默认返回 1;
- 避免依赖 System.exit() 做流程控制(如循环退出),应优先用正常 return 或异常传播;
- 若程序是容器化部署(如 Docker),退出码会被容器引擎捕获,影响 restart 策略和健康检查判断;
- 日志中建议同时输出 exit code,便于排查:“Exiting with status 3 (DB_FAILURE)”。











