作为可执行jar运行时无法打开java应用程序

时间:2012-09-19 12:44:29

标签: java error-handling try-catch startup executable-jar


我今天遇到了一个奇怪的问题......我打算做一个简单的例子,因为它“值得千言万语”: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块中时才会出现此问题。 我通过更改启动时执行的某些检查的顺序来纠正错误。

btw问题应该永远不会发生,因为它是由JDBC驱动程序类名的数量错误引起的,要加载到静态块中。

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

1 个答案:

答案 0 :(得分:0)

我可以想到三个可能的解释,ExceptionInInitializerError没有被你的例子捕获:

  • 可能会被JOptionPane.showMessageDialog(null, "Oooops!");

  • 抛出
  • 在调用main之前可能会抛出它。

  • 它可能会被抛到不同的堆栈上。

事实上,我认为第二个是最有可能的,因为在类的初始化期间抛出(并且未捕获)某些未经检查的异常时会抛出ExceptionInInitializerError。在您输入try块之前可能会发生这种情况。