在这种情况下,在Java中绕过try catch?

时间:2012-11-27 17:29:37

标签: java multithreading exception-handling try-catch

我设法绕过了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");

2 个答案:

答案 0 :(得分:4)

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

以下是JLS的相关部分:

  

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

     

...

     

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

答案 1 :(得分:0)

您的异常将在另一个线程中抛出。这就是它没有被抓住的原因。您可能希望在tyour新线程中捕获它并以某种方式将其传播到主线程。