0


我今天遇到了一个奇怪的问题......我将做一个简化的例子,因为它“值得一千个字”: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 驱动程序类名的自愿错误引起的,以加载到静态块中。

好吧,至少它让我清楚地理解了为什么构造函数和静态初始化块不应该抛出异常:它使得在抛出异常的类被许多类使用的情况下调试几乎是不可能的,因为它可能变得很难找到加载类时退出。

4

1 回答 1

0

ExceptionInInitializerError对于您的示例中没有被捕获的问题,我可以想到三种可能的解释:

  • 它可能被抛出JOptionPane.showMessageDialog(null, "Oooops!");

  • 它可以在main被调用之前被抛出。

  • 它可以被扔到不同的堆栈上。

事实上,我认为第二个是最有可能的,因为ExceptionInInitializerError在类的初始化期间抛出一些未经检查的异常(而不是捕获)时抛出。这很可能在您进入try街区之前发生。

于 2012-09-19T12:55:36.437 回答