【问题标题】:IllegalStateException not caught未捕获 IllegalStateException
【发布时间】:2013-09-02 13:10:04
【问题描述】:

我想在 Scala 中捕获 IllegalStateException。以下代码

val scene = new SceneDock

如果之前未启动 JavaFX 应用程序,则抛出 IllegalStateException。这个构造函数来自 JemmyFX 框架。

所以我想通过以下方式捕获这个异常:

try{
 val scene = new SceneDock
 "running"}
catch{
 case e: IllegalStateException => { "stopped" } }

但它不起作用。输出始终是 IllegalStateException: Toolkit not initialized 并且它会重复,直到我终止应用程序。已经尝试过捕获异常,并用Java尝试过,但总是相同的结果。

堆栈跟踪(它会重复,直到我终止应用程序):

java.lang.IllegalStateException: Toolkit not initialized
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:155)
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:150)
at javafx.application.Platform.runLater(Platform.java:52)
at org.jemmy.fx.QueueExecutor.executeQueue(QueueExecutor.java:98)
at org.jemmy.action.AbstractExecutor.execute(AbstractExecutor.java:100)
at org.jemmy.fx.SceneList.getControls(SceneList.java:58)
at org.jemmy.lookup.PlainLookup.getChildren(PlainLookup.java:76)
at org.jemmy.lookup.AbstractLookup.refresh(AbstractLookup.java:172)
at org.jemmy.lookup.AbstractLookup$1.reached(AbstractLookup.java:141)
at org.jemmy.lookup.AbstractLookup$1.reached(AbstractLookup.java:137)
at org.jemmy.timing.Waiter.waitState(Waiter.java:78)
at org.jemmy.timing.Waiter.ensureState(Waiter.java:119)
at org.jemmy.lookup.AbstractLookup.wait(AbstractLookup.java:137)
at org.jemmy.lookup.AbstractLookup.get(AbstractLookup.java:250)
at org.jemmy.lookup.AbstractLookup.wrap(AbstractLookup.java:210)
at org.jemmy.dock.Dock.lookup(Dock.java:75)
at org.jemmy.fx.SceneDock.<init>(SceneDock.java:20)
at org.jemmy.fx.SceneDock.<init>(SceneDock.java:32)
at org.jemmy.fx.SceneDock.<init>(SceneDock.java:60)
at org.djemmysl.main.DjemmySL$class.applicationStatus(DjemmySL.scala:25)
at org.djemmysl.main.Main$.applicationStatus(Main.scala:3)
at org.djemmysl.main.Main$.main(Main.scala:6)
at org.djemmysl.main.Main.main(Main.scala)

java.lang.IllegalStateException: Toolkit not initialized
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:155)
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:150)
at javafx.application.Platform.runLater(Platform.java:52)
at org.jemmy.fx.QueueExecutor.executeQueue(QueueExecutor.java:98)
at org.jemmy.action.AbstractExecutor.execute(AbstractExecutor.java:100)
at org.jemmy.fx.SceneList.getControls(SceneList.java:58)
at org.jemmy.lookup.PlainLookup.getChildren(PlainLookup.java:76)
at org.jemmy.lookup.AbstractLookup.refresh(AbstractLookup.java:172)
at org.jemmy.lookup.AbstractLookup$1.reached(AbstractLookup.java:141)
at org.jemmy.lookup.AbstractLookup$1.reached(AbstractLookup.java:137)
at org.jemmy.timing.Waiter.waitState(Waiter.java:78)
at org.jemmy.timing.Waiter.ensureState(Waiter.java:119)
at org.jemmy.lookup.AbstractLookup.wait(AbstractLookup.java:137)
at org.jemmy.lookup.AbstractLookup.get(AbstractLookup.java:250)
at org.jemmy.lookup.AbstractLookup.wrap(AbstractLookup.java:210)
at org.jemmy.dock.Dock.lookup(Dock.java:75)
at org.jemmy.fx.SceneDock.<init>(SceneDock.java:20)
at org.jemmy.fx.SceneDock.<init>(SceneDock.java:32)
at org.jemmy.fx.SceneDock.<init>(SceneDock.java:60)
at org.djemmysl.main.DjemmySL$class.applicationStatus(DjemmySL.scala:25)
at org.djemmysl.main.Main$.applicationStatus(Main.scala:3)
at org.djemmysl.main.Main$.main(Main.scala:6)
at org.djemmysl.main.Main.main(Main.scala)

【问题讨论】:

  • 会不会有两个 IllegalStateException 类? (希望不会)
  • 不,输出显示它是 java.lang.IllegalStateException,所以我认为没有另一个 ;)
  • 您可以将堆栈跟踪添加到问题中吗?
  • 那你可以试试case e: java.lang.IllegalStateException =&gt; { "stopped" }
  • 我也试过这个,但没有其他结果。

标签: java scala javafx-2 javafx-8 uncaught-exception


【解决方案1】:

实例化SceneDock 稍等片刻(我猜默认为 10 秒),直到启动 jemmy fx 应用程序。 在此等待期间,它会定期(默认为每 100 毫秒)查找是否已通过在 javafx thread(使用 Platform.runLater(Runnable))中执行任务打开了窗口。

当没有应用程序启动时调用Platform.runLater(Runnable),一个java.lang.IllegalStateException被抛出,捕获并打印到错误输出:

java.lang.IllegalStateException: Toolkit not initialized
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:153)
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:148)
    ...

如果一段时间后没有申请,你应该得到一个org.jemmy.TimeoutExpiredException

org.jemmy.TimeoutExpiredException: State 'Waiting for 1 javafx.scene.Scene controls to be found adhering to org.jemmy.lookup.Any@65e7c41f' has not been reached in 10000 milliseconds
at org.jemmy.timing.Waiter.ensureState(Waiter.java:121)
at org.jemmy.lookup.AbstractLookup.wait(AbstractLookup.java:138)
    ...

我通过以下代码得到了这种行为:

import org.jemmy.TimeoutExpiredException;
import org.jemmy.fx.SceneDock;
import org.junit.Test;

public class TestX {

    @Test
    public void notInitializedToolkit() {
        try {
            new SceneDock();

        } catch (TimeoutExpiredException e) {
            System.err.println("The application have not been launched");
        }
    }
}

【讨论】:

  • 好吧,你的意思是因为之前被抓到了,输出后就抓不到了?如果应用程序正在运行,您还有其他方法可以测试吗?
  • AFAIK,没有公共 API 来获取正在运行的应用程序。您可以使用Window.impl_getWindows() 来获取所有打开的窗口。
  • 我想我已经找到了解决方案:只需使用引发 IllegalStateException 的方法。在 try 块中我调用 Platform.runLater(new Runnable(){ @Override def run() { } });现在我可以捕获异常了。
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 2012-09-22
相关资源
最近更新 更多