当尝试在另一个线程中打开JFrame时,java.lang.ExceptionInInitializeError错误的原因和解决方法是什么?

当尝试在另一个线程中打开JFrame时,java.lang.ExceptionInInitializeError错误的原因和解决方法是什么?,java,swing,jframe,Java,Swing,Jframe,我正在尝试创建一个测试类来打开JFrame。为了在主线程结束时阻止窗口关闭,我添加了代码以在另一个线程中打开窗口。每次运行应用程序时,都会出现以下异常: Exception in thread "Test Thread" java.lang.ExceptionInInitializerError at java.lang.Runtime.addShutdownHook(Runtime.java:192) at java.util.logging.LogManager.(LogMa

我正在尝试创建一个测试类来打开JFrame。为了在主线程结束时阻止窗口关闭,我添加了代码以在另一个线程中打开窗口。每次运行应用程序时,都会出现以下异常:

Exception in thread "Test Thread" java.lang.ExceptionInInitializerError at java.lang.Runtime.addShutdownHook(Runtime.java:192) at java.util.logging.LogManager.(LogManager.java:237) at java.util.logging.LogManager$1.run(LogManager.java:177) at java.security.AccessController.doPrivileged(Native Method) at java.util.logging.LogManager.(LogManager.java:158) at java.util.logging.Logger.getLogger(Logger.java:273) at java.awt.Component.(Component.java:173) at reflector.ApplicationRunner.startObjectsPool(ApplicationRunner.java:18) at reflector.ReflectorEndToEndTest$1.run(ReflectorEndToEndTest.java:20) Caused by: java.lang.IllegalStateException: Shutdown in progress at java.lang.Shutdown.add(Shutdown.java:62) at java.lang.ApplicationShutdownHooks.(ApplicationShutdownHooks.java:21) ... 9 more
我不明白我为什么会遇到这个问题。

异常消息确切地告诉您出了什么问题:您正在尝试在JVM关闭时创建一个新线程


JVM在主线程完成时关闭的原因是您在事件线程上调用了
setDaemon(true)
。删除该行后,只要该线程处于活动状态,JVM就会一直保持运行。

异常消息会准确地告诉您出了什么问题:JVM关闭时,您正试图创建一个新线程


JVM在主线程完成时关闭的原因是您在事件线程上调用了
setDaemon(true)
。删除该行,JVM将保持运行,只要该线程处于活动状态。

当您尝试将线程设置为守护进程(true)时,就会出现问题。退出应用程序时,线程无法停止,因此抛出
java.lang.IllegalStateException:Shutdown in progress

当您遇到这个问题时,您必须显式地告诉运行时通过添加shotdownhook来关闭线程

public void createIntegerClass() throws Exception {
    Thread t = new Thread("Test Thread") {...};

    Runtime.getRuntime().addShutdownHook(t);//explicit!
    t.start();
    t.setDaemon(true);
}

当您尝试将线程设置为守护进程(true)时,就会出现问题。退出应用程序时,线程无法停止,因此抛出
java.lang.IllegalStateException:Shutdown in progress

当您遇到这个问题时,您必须显式地告诉运行时通过添加shotdownhook来关闭线程

public void createIntegerClass() throws Exception {
    Thread t = new Thread("Test Thread") {...};

    Runtime.getRuntime().addShutdownHook(t);//explicit!
    t.start();
    t.setDaemon(true);
}

我把setDaemon代码注释掉了,我仍然得到了那个异常。很难看到发生了什么,请你修改一下你问题的格式好吗。无论如何,试图在JVM已经关闭时启动一个新线程来保存JVM是一种非常奇怪的方法:-)我发现了这个问题。原因是,如果不使用Nat Pyrce的窗口舔器库,就不需要生成另一个线程。我的意图是自动化Swing GUI测试。我注释了setDaemon代码,但仍然得到了该异常。很难看到发生了什么,请您修复问题的格式。无论如何,试图在JVM已经关闭时启动一个新线程来保存JVM是一种非常奇怪的方法:-)我发现了这个问题。原因是,如果不使用Nat Pyrce的窗口舔器库,就不需要生成另一个线程。我的意图是自动化SwingGUI测试;如果不正确,请还原。重新格式化的代码;如果不正确,请回复。我希望我能投票,因为它也解决了我的问题:我希望我能投票,因为它也解决了我的问题: