我今天遇到了一个奇怪的问题......我将做一个简化的例子,因为它“值得一千个字”:D
public class Application() {
public static void main(String[] args) {
try {
A a = new A(); // this may throw exceptions
// (which will cause an ExceptionInInitializerError)
} catch (Throwable t) {
JOptionPane.showMessageDialog(null, "Oooops!");
System.exit(1);
}
}
}
由于它是一个带有 Swing GUI 的独立应用程序,我的目标是在出现任何问题时向用户发送消息(在这种情况下是在启动时)......上面的代码在 Eclipse IDE 中工作,但是当我导出项目时双击它作为可执行jar,好吧,它只是不会打开。
所以我尝试在 cmd 中执行它,java -jar application.jar
并在 shell 中打印出一个ExceptionInInitializerError
.
为什么错误没有被捕获?
即使我指定它也不起作用catch (ExceptionInInitializerError e)
。
编辑: 经过更深入的调试,我发现这个问题只发生在两个特定异常发生并且后者发生在前者的 catch 块中时。我通过更改我在启动时执行的一些检查的顺序来纠正错误。
顺便说一句,这个问题永远不会发生,因为它是由 JDBC 驱动程序类名的自愿错误引起的,以加载到静态块中。
好吧,至少它让我清楚地理解了为什么构造函数和静态初始化块不应该抛出异常:它使得在抛出异常的类被许多类使用的情况下调试几乎是不可能的,因为它可能变得很难找到加载类时退出。