2013-09-02 7 views
1

Я хочу поймать IllegalStateException в Scala. Следующий кодIllegalStateException не пойман

val scene = new SceneDock 

вызывает исключение IllegalStateException, если приложение JavaFX ранее не запускалось. Этот конструктор из структуры JemmyFX.

Так я хочу, чтобы поймать это исключение следующим образом:

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

Но это не работает. Результатом всегда является IllegalStateException: Toolkit не инициализирован, и он повторяется до тех пор, пока я не закончу приложение. Уже пытались поймать Exception и попробовали его с Java, но всегда один и тот же результат.

трассировки стека (это repeads, пока я не закончить приложение):

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) 
+0

Может ли быть два класса IllegalStateException? (Надеюсь, нет) –

+0

Нет, выход говорит, что это java.lang.IllegalStateException, поэтому я не думаю, что есть еще один;) – AKR

+0

Можете ли вы добавить трассировку стека к вопросу? – iain

ответ

2

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 [email protected]' 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"); 
     } 
    } 
} 
+0

Итак, вы имеете в виду, потому что он пойман раньше, я не могу поймать его после выхода? Есть ли у вас другой метод тестирования, если приложение запущено или нет? – AKR

+0

AFAIK, для запуска запущенного приложения нет открытого API. Вы можете использовать 'Window.impl_getWindows()', чтобы получить все открытые окна. – gontard

+0

Я думаю, что нашел решение: просто я использую метод, который бросает исключение IllegalStateException. в блоке try я вызываю Platform.runLater (новый Runnable() { @Override def run() { } }); Теперь я могу поймать Исключение. – AKR

Смежные вопросы