我对一个程序在没有输入
main
的情况下默默退出感到困惑,结果发现这是因为静态块中的 System.loadLibrary
调用抛出了 UnsatisfiedLinkError
。为了缩小问题范围,这是一个使程序默默失败的构造:
public class T {
static void bad() {
throw new RuntimeException("Terror error!");
}
static {
System.out.println("in static");
bad();
}
public static void main(String[] args) {
System.out.println("in main");
}
}
运行此命令时,进程仅在“静态”打印后静默退出,退出代码为 1。至少我当前的 Java 环境“OpenJDK 64 位服务器 VM Homebrew(版本 22.0.2,混合版)”会发生这种情况。模式,共享)”。
当然,这可以通过
bad
调用周围的 try-catch 块来修复,但是如果因为程序员不清楚需要它而没有这样的块怎么办? (例如,有人可能在我无法控制的库中做了这种事情。)有没有办法挂钩来处理从静态块抛出的 Error
或 RuntimeException
,至少获得一条消息这表明问题发生在哪里?
静态块在程序开始运行之前加载(控制转到主方法)。由于静态块抛出运行时异常,程序退出。