Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java(SWT/JFace)-处理Runnable中的所有异常_Java_Exception Handling_Swt_Jface - Fatal编程技术网

Java(SWT/JFace)-处理Runnable中的所有异常

Java(SWT/JFace)-处理Runnable中的所有异常,java,exception-handling,swt,jface,Java,Exception Handling,Swt,Jface,我有一个SWT/JFace应用程序,它使用Realm(不确定概念)类作为线程运行主程序。我试图在主代码周围使用try/catch块捕获任何未捕获的异常: public static void main(String args[]) { // ref: http://forums.instantiations.com/viewtopic.php?f=1&t=1583 Realm.runWithDefault(SWTObservables.getRealm(display),

我有一个SWT/JFace应用程序,它使用Realm(不确定概念)类作为线程运行主程序。我试图在主代码周围使用try/catch块捕获任何未捕获的异常:

public static void main(String args[]) {
    // ref: http://forums.instantiations.com/viewtopic.php?f=1&t=1583
    Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
        public void run() {
            try {
                PropertyConfigurator.configure("log4j.properties");
                MainWindow window = new MainWindow();
                window.setBlockOnOpen(true);
                window.open();
                Display.getCurrent().dispose();
            } catch (Exception e) {
                MessageDialog.openError(null, "Error", "Error occurred: " + e.getMessage());
                logger.error("Error!!!", e);
                e.printStackTrace();
            }
        }
    });
}
错误会被抛出回
窗口。open()
行,但随后会传递到Realm,因此永远不会到达
catch
块。以下是堆栈跟踪的结尾:

at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
at org.eclipse.jface.window.Window.open(Window.java:801)
at com.ism.MainWindow$1.run(MainWindow.java:210) <-- "window.open();"
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at com.ism.MainWindow.main(MainWindow.java:204) <-- "Realm.runWithDefault....."
org.eclipse.jface.window.window.runEventLoop(window.java:825)上的

位于org.eclipse.jface.window.window.open(window.java:801)

在com.ism.MainWindow$1.run(MainWindow.java:210)上,一些UI runnable正在显示事件循环中抛出一个
异常。您需要设置不同的事件循环异常处理程序。(默认设置只是将异常打印到控制台。)

例如:

Window.setExceptionHandler(new Window.IExceptionHandler() {
    public void handleException(Throwable error) {
        MessageDialog.openError(null, "Error", "Error: " + error.getMessage());
    }
});
当然,你也可以像你的例子中那样,在你的顶级水平上重新起球并接球


但是,请注意,这是
窗口上的一个静态方法,因此此异常处理程序是应用程序范围的一些可运行的UI正在显示事件循环中抛出一个
异常。您需要设置不同的事件循环异常处理程序。(默认设置只是将异常打印到控制台。)

例如:

Window.setExceptionHandler(new Window.IExceptionHandler() {
    public void handleException(Throwable error) {
        MessageDialog.openError(null, "Error", "Error: " + error.getMessage());
    }
});
当然,你也可以像你的例子中那样,在你的顶级水平上重新起球并接球


但是,请注意,这是
窗口上的一个静态方法,因此此异常处理程序是应用程序范围的您的
catch
块仅捕获
异常。但是,您并没有说明哪些异常被抛出,哪些异常没有被捕获。因此,在没有任何进一步信息的情况下,我猜测这些异常实际上是
Error
s。尝试
catch(Throwable e)
而不是
catch(Exception e)
您的
catch
块仅捕获
异常。但是,您并没有说明哪些异常被抛出,哪些异常没有被捕获。因此,在没有任何进一步信息的情况下,我猜测这些异常实际上是
Error
s。尝试
catch(Throwable e)
而不是
catch(Exception e)

你所说的“返回到
window.open()
line fine”是什么意思?你所说的“返回到
window.open()
line fine”是什么意思?完整的堆栈跟踪会很方便。到目前为止,如果抛出的NPE被包装成一个
错误
,则看起来是人工智能。完整的堆栈跟踪会很方便。到目前为止,如果抛出的NPE被包装到一个
错误中,似乎是人工智能。对于我最初的try/catch为什么不起作用,仍然感到困惑,但您给出的示例很有效。事件循环的默认异常处理程序只调用
e.printStackTrace()
。因此,在
window.open()
调用中,实际上没有任何东西被抛出给您。对于我最初的try/catch为什么不起作用,仍然感到困惑,但您给出的示例很好。事件循环的默认异常处理程序只调用
e.printStackTrace()
。所以在
window.open()
调用中实际上没有任何东西被抛出给您。