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抛出无法捕获的非法状态异常?的主要内容,如果未能解决你的问题,请参考以下文章