今天我遇到了一个奇怪的问题……我将举一个简化的示例,因为它“值一千个字”: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,好吧,它将无法打开。
所以我尝试使用
java -jar application.jar
在cmd中执行它,并在 shell 中打印出一个ExceptionInInitializerError
。为什么没有发现错误?
即使我指定
catch (ExceptionInInitializerError e)
也不起作用。编辑:
经过更深入的调试后,我发现只有在发生两个特定的异常并且后者发生在前者的catch块中时,才会发生此问题。
我通过更改启动时执行的某些检查的顺序纠正了该错误。
问题btw永远不会发生,因为它是由JDBC驱动程序类名称的一个自愿错误加载到静态块中引起的。
好吧,至少它使我清楚地理解了为什么构造函数和静态初始化块不应该引发异常:在引发异常的类被许多类使用的情况下,调试几乎是不可能的,因为可能很难找到类加载时退出。
最佳答案
我可以想到在您的示例中未捕获ExceptionInInitializerError
的三种可能的解释:
JOptionPane.showMessageDialog(null, "Oooops!");
抛出main
之前将其抛出。 实际上,我认为第二个是最有可能的,因为在初始化类时引发了一些未经检查的异常(而不是捕获)时,会引发
ExceptionInInitializerError
。在您进入try
块之前,很可能会发生这种情况。
关于java - 作为可执行jar运行时无法打开Java应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12494968/