【发布时间】:2012-09-20 00:23:06
【问题描述】:
我今天遇到了一个奇怪的问题......我将做一个简化的例子,因为它“值得一千个单词”: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 驱动程序类名自愿错误加载到静态块中引起的。
好吧,至少它让我清楚地理解了为什么构造函数和静态初始化块不应该抛出异常:它使得在抛出异常的类被许多类使用的情况下调试几乎是不可能的,因为它可能变得非常很难找出类何时加载。
【问题讨论】:
-
堆栈跟踪中有什么?
-
确保类路径中的类
A -
你有一个适当的主类清单文件吗?这有帮助吗:stackoverflow.com/questions/6348258/…
-
1) 将
} catch (Throwable t) {...更改为} catch (Throwable t) { t.printStackTrace(); ...2) 复制/粘贴输出作为编辑。 -- 请注意,要将行号与源匹配,您需要提供 SSCCE(带导入)。我怀疑问题在于“双击启动”正在启动 JRE 的不同(早期)版本,所有麻烦都从那里开始。
标签: java error-handling try-catch startup executable-jar