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

标签 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,好吧,它将无法打开。

所以我尝试使用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/

    相关文章:

    matlab 无法捕获子函数中的错误

    JavaBuilder 处理 CoreException

    php - 试图获取非对象Laravel PHP 5.8的属性 'cname'

    Python try/except 不断尝试直到没有错误

    php - 捕获不工作以及如何取消设置异常处理程序

    ruby-on-rails - fieldWithErrors 没有包装每个错误字段

    java - 为实现接口(interface)的类实现可序列化

    java - JDBC connection.getschema() 抽象方法错误

    java - 如何关闭 EasyMock 对象的记录?

    java - Grails 嵌套域 - 将所有错误添加到顶级域对象