javaFX Alert抛出无法捕获的非法状态异常?

Posted

技术标签:

【中文标题】javaFX Alert抛出无法捕获的非法状态异常?【英文标题】:javaFX Alert throwing uncatchable illegal state exception? 【发布时间】:2015-06-26 14:14:54 【问题描述】:

对包含 JavaFX 警报的类运行一些单元测试,我实现了以下 try-catch 块:

    try
    if(warning)
        //CONSIDER:  Make a generic alert call for any situation, pass args 
        Alert alert = new Alert(AlertType.WARNING);
        alert.setTitle("User Warning");
        alert.setHeaderText(null);
        alert.setContentText("The following elements were not found for the code you are outputting and are printed, as is"
                + "\n\n" + errorList
                + "\n\n(This should be updated to Z000 format) ");
        alert.showAndWait();
    
    //throws error when invoked from a non javaFX context
    catch(IllegalStateException e)        
        System.out.println("The following elements were not found for the code you are outputting and are printed, as is"
                + "/n/n" + errorList
                + "/n/n(This should be updated to Z000 format)");
    

在对调用代码进行*** try-catch 后也没有修复它。

堆栈:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at javafx.scene.control.DialogPane.createContentLabel(DialogPane.java:166)
    at javafx.scene.control.DialogPane.<init>(DialogPane.java:217)
    at javafx.scene.control.Dialog.<init>(Dialog.java:478)
    at javafx.scene.control.Alert.<init>(Alert.java:245)
    at javafx.scene.control.Alert.<init>(Alert.java:223)
    at gov.ornl.nstd.datatools.OutputFormatter.verifyAndNorm(OutputFormatter.java:385)
    at gov.ornl.nstd.datatools.OutputFormatter.convert(OutputFormatter.java:218)
    at gov.ornl.nstd.datatools.Testing.TestAllOutputs.main(TestAllOutputs.java:49)
Caused by: java.lang.IllegalStateException: Toolkit not initialized
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273)
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268)
    at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:550)
    at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512)
    at javafx.scene.control.Control.<clinit>(Control.java:87)
    ... 8 more

有什么方法可以解决这个问题?

我从错误中得到的是没有 JavaFX 场景/阶段可与警报相关联,但我不确定如何处理。

【问题讨论】:

如果错误不是从 GUI 调用时填充得很好但与单元测试无关的 GUI 元素,那将是一个合理的建议。就目前而言,“工具包未初始化”的错误似乎是一个 JavaFX 问题,它没有在测试中使用,因为经过验证可以正常工作。 【参考方案1】:

JavaFX 在启动时执行“隐藏”初始化。将警报作为单元测试运行不会触发初始化。触发它的最简单方法是执行 Application.launch()。还有其他方法可以查看几个链接

JavaFX: “Toolkit” not initialized Toolkit not initialized tool kit issue

【讨论】:

我不是在尝试运行警报,它只是存在于代码中,因为它是向用户发出的警报,他们应该注意从那时起向前推进的条件。单元测试正在测试代码的其余部分,实际上我宁愿它不调用而不必为其使用标志。但是,就您而言:在什么上下文中执行 Application.launch() ?警报还是单元测试? 不知道你是如何设计你的单元测试用例的。如果你能解释更多关于它并提供更多代码片段将会很有帮助。关于应用程序类检查这个文档docs.oracle.com/javafx/2/api/javafx/application/… 当在输出中检测到某些条件时,OutputFormatter 会发出警报。该课程根据单位偏好对数据进行了大量检查和规范化。我正在对所有输出进行详尽的测试,使用用户可以通过第二个类提供的所有可能参数调用 OutputFormatters 主要方法,该类实例化输出格式化程序,并使用一堆嵌套循环为其提供数据。让输出格式化程序抛出异常而不是捕获它并让 GUI 处理警报可能会更好,但它目前在格式化类的内部。 原来你可以扩展 Application.它不会弹出警报,但不会崩溃。【参考方案2】:

解决问题就像在您运行测试的类中扩展 Application 一样简单。

这不会生成警报框,但可以避免崩溃。

编辑:这会使警报未处理,需要强制退出该过程。

【讨论】:

以上是关于javaFX Alert抛出无法捕获的非法状态异常?的主要内容,如果未能解决你的问题,请参考以下文章

浅析c++异常

mMap.addPolyline 抛出非法状态异常

使用 Maven 的 JavaFX 11 抛出异常:“WindowsNativeRunloopThread”

关于抛出异常的学习与感受

PHP 异常处理 总出现致命错误 无法捕获异常

Java中的异常的捕获和抛出是啥意思,有啥区别