繁体   English   中英

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

[英]Can't open java application when ran as 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 的作品 ,但是当我出口项目双击可执行文件作为可执行文件,那么它就不会打开。

所以我尝试使用java -jar application.jar在cmd中执行它,并在外壳中打印出ExceptionInInitializerError

为什么没有发现错误?
即使我指定catch (ExceptionInInitializerError e)也不起作用。

编辑:经过更深入的调试后,我发现只有在发生两个特定的异常而后者发生在前者的catch块中时,才会发生此问题。 我通过更改启动时执行的某些检查的顺序纠正了该错误。

问题btw永远不会发生,因为它是由JDBC驱动程序类名称的一个自愿错误加载到静态块中引起的。

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

我可以想到三种在您的示例中未捕获到ExceptionInInitializerError可能解释:

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

  • 可以在调用main之前将其抛出。

  • 可以将其抛出不同的堆栈。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM