0

通过嵌套多个线程,我设法绕过了 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");
4

2 回答 2

4

异常不会自动跨线程边界传播。如果在特定线程中抛出异常,则只能在该线程中捕获它。您的代码的词法结构在这方面没有任何区别。

以下是JLS的相关部分:

在抛出异常的过程中,Java 虚拟机会突然将所有在当前线程中已经开始但尚未完成执行的表达式、语句、方法和构造函数调用、初始化器和字段初始化表达式一个一个地完成。这个过程一直持续到找到一个处理程序,该处理程序通过命名异常的类或异常类的超类来指示它处理该特定异常(第 11.2 节)。如果没有找到这样的处理程序,则异常可能由未捕获的异常处理程序的层次结构之一处理(第 11.3 节) - 因此会尽一切努力避免让异常未处理。

...

如果找不到catch可以处理异常的子句,则终止当前线程(遇到异常的线程)。

于 2012-11-27T17:31:42.977 回答
0

您的异常在不同的线程中被抛出。这就是为什么它没有被抓住。您可能想在新线程中捕获它并以某种方式将其传播到主线程。

于 2012-11-27T17:31:55.037 回答