JavaFX2-捕获所有运行时异常
我试过了JavaFX2-捕获所有运行时异常,java,exception-handling,javafx-2,Java,Exception Handling,Javafx 2,我试过了 Thread.setDefaultUncaughtExceptionHandler... public static void main(String[] args) { try { launch(args); }catch(Throwable t) { System.out.println(t.getMessage); } } 在main中,也在start(Stage primaryStage)方法中。它不起作用了。 我也试过了 Thread.setDefault
Thread.setDefaultUncaughtExceptionHandler...
public static void main(String[] args) {
try {
launch(args);
}catch(Throwable t) {
System.out.println(t.getMessage);
}
}
在main中,也在start(Stage primaryStage)方法中。它不起作用了。
我也试过了
Thread.setDefaultUncaughtExceptionHandler...
public static void main(String[] args) {
try {
launch(args);
}catch(Throwable t) {
System.out.println(t.getMessage);
}
}
异常堆栈跟踪 位于javafx.concurrent.Task$TaskCallable$2.run(Task.java:1251) PlatformImpl$3.run(PlatformImpl.java:141) 位于com.sun.glass.ui.gtk.GtkApplication.\u runLoop(本机方法) com.sun.glass.ui.gtk.GtkApplication$1$1.run(GtkApplication.java:56) 运行(Thread.java:662)
感谢您的帮助。一些托管线程(如UI事件处理程序和ExecutorServices)可自行捕获丢弃,以避免线程死亡。只有死的线程才会使用此UncaughtExceptionHandler。如果您想捕获抛出的异常,您必须在可以抛出这些异常的方法中执行thsi 如果UI事件处理程序有一种报告异常的方法,那么它将是另一种方法
第二个示例将捕获该线程中抛出的异常。在其他线程上抛出的异常将被该线程捕获。如果您检查
Platform.runLater()
(见下文),您将看到异常被吞没(第146/147行),因此默认的未捕获异常处理程序将无法捕获它们-基于该段代码,我认为除了在Runnable中包含try/catch块之外,您没有其他选择
请注意(需要登录-注册是免费的),并且应该在Lombard中修复(=Java FX 8.0将于明年与Java 8一起发布)
您也可以创建一个实用程序方法并调用
Platform.runLater(getFxWrapper(yourRunnable));
public static Runnable getFxWrapper(final Runnable r) {
return new Runnable() {
@Override
public void run() {
try {
r.run();
} catch (Exception e) {
//here you probably want to log something
System.out.println("Found an exception");
}
}
};
}
:
将EventDispatcher设置为根节点对我很有用
public class Frame extends Pane {
Frame() {
setEventDispatcher(new EventDispatcher() {
@Override
public Event dispatchEvent(Event event, EventDispatchChain chain) {
try {
return chain.dispatchEvent(event);
} catch (final Exception e) {
// handle all the exceptions here
return null;
}
}
});
}
}
您是否尝试捕获所有异常类的基类?NullPointerException如何?所有异常和错误的处理都是相同的。您的问题应该有一个优雅的解决方案。查看源代码以查看是否存在源代码。;)在Java 7中,setDefaultUncaughtExceptionHandler也应该适用于EDT线程。对于Java6,请看:我已经悬赏了,因为我认为这个问题需要更多的关注。基于这个新的“不可调度”原则,我们最终可能会使用不同的异常管理“体系结构”,但接下来需要一些示例和解释,因为我们中的许多人正确地认为setDefaultUncaughtExceptionHandler应该可以工作。对不起,我让赏金到期了:-(,而我应该给出这个答案。换一个新的怎么样?@AgostinoX我以前也遇到过这种情况;-)您不必。感谢您指出这一点。但是,您的包装器将仅适用于可运行代码中直接抛出的异常。例如,如果您在可运行代码中设置场景,它将在场景构建期间捕获异常,但不会捕获稍后发生的异常,例如,通过实际使用场景时发生的事件…@MartinMeyer Those其他异常应该是“可捕获的”(即不被吞没)。与下面的注释相同。包装有效吗?看到有问题的异常在(现在是内线程,直到被吞没),那么我们会得到该异常对象的任何信息吗?请原谅我的基本疑问,请尝试{r.run();//额外代码}catch(Throwbale t){t.printStackTrace();}堆栈跟踪是r的吗?