【问题标题】:Can't open java application when ran as executable jar作为可执行jar运行时无法打开java应用程序
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我认为这绝对不能发生,因为我没有使用main() 方法在类中声明任何内容,并且在try/catch 块之外没有任何内容。如果我使用 Eclipse 运行,一切正常,一切都会被捕获(在我的真实代码中,我也会检查其他异常)。
猜你喜欢
  • 2013-08-22
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 2021-01-06
  • 2014-11-10
相关资源
最近更新 更多