我需要根据我的应用程序结果修改 JVM 返回代码。
但是显式调用System.exit(code(是有风险的,因为应用程序很复杂,很难确定正在运行的线程的结束。
所以我想出使用关闭钩子在 JVM 退出之前修改返回代码。
但是有一个问题,我如何获取 JVM 的原始返回代码,因为它可能是一个错误代码不是 0。
你不应该在关闭钩子中调用 exit 方法,System.exit(status)
内部调用 Runtime.getRuntime().exit(status);
这将导致你的应用程序无限期阻塞。
根据JavaDoc
如果在虚拟机启动其 关闭顺序,然后如果关闭钩子正在运行此方法 将无限期阻止。
您无权访问status
,因为即使在调用所有关闭钩子后,它也可能更改。
由于关闭钩子和退出状态不兼容,您可以创建一个 Throwable,其唯一功能是在 main 方法中捕获。然后,捕获块成为您的关闭块。在那里你可以调用System.exit((,如果你愿意,甚至可以保留你的关机代码。
class Emergency extends Throwable{
int exit = 0;
}
public final class Entry {
public static void main(String[] args){
try {
throw new Emergency();
} catch (Emergency e) {
// Shut down the app
}
}
}