我设法绕过了try catch块, 通过嵌套多个线程。
是否存在一些规则,在记录时,异常会绕过try catch块?
try{
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Thread");
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
System.out.println("ThreadGUI");
throw new NullPointerException();
}
});
}
};
Thread t = new Thread(r);
t.start();
} catch(NullPointerException e) {
//nothing
}
System.out.println("Ende");
答案 0 :(得分:4)
异常不会自动跨线程边界传播。如果在特定线程中抛出异常,则只能在该线程中捕获它。代码的词法结构在这方面没有任何区别。
以下是JLS的相关部分:
在抛出异常的过程中,Java虚拟机一个接一个地突然完成任何已经开始但未完成执行的表达式,语句,方法和构造函数调用,初始化程序和字段初始化表达式当前线程。此过程一直持续到找到一个处理程序,指示它通过命名异常的类或异常类的超类(第11.2节)来处理该特定异常。如果没有找到这样的处理程序,那么异常可以由未捕获的异常处理程序层次结构之一处理(第11.3节) - 因此,我们尽一切努力避免异常处理未处理。
...
如果找不到可以处理异常的
catch
子句,则终止当前线程(遇到异常的线程)。
答案 1 :(得分:0)
您的异常将在另一个线程中抛出。这就是它没有被抓住的原因。您可能希望在tyour新线程中捕获它并以某种方式将其传播到主线程。