2009-12-14 155 views
0

鉴于这种代码:为什么我的代码似乎绕过了这个异常?

public class TwoThreads { 
    static Thread laurel, hardy; 

    public static void main(String[] args) { 
     laurel = new Thread() { 
      public void run() { 
       System.out.println("A"); 
       try { 
        hardy.sleep(1000); 
       } catch (Exception e) { 
        System.out.println("B"); 
       } 
       System.out.println("C"); 
      } 
     }; 

     hardy = new Thread() { 
      public void run() { 
       System.out.println("D"); 
       try { 
        laurel.wait(); 
       } catch (Exception e) { 
        System.out.println("E"); 
       } 
       System.out.println("F"); 
      } 
     }; 
     laurel.start(); 
     hardy.start(); 
    } 
} 

输出包括:

A C D E and F 

我疑惑为什么飞机包括F,因为在等待()被调用的​​码外的IllegalMonitorStateException抛出。为什么F的打印语句达到了?我相信线程堆栈会随之而来,但是程序应该将控制权交给主堆栈。

这是正确的吗?

回答

6

您正在捕获打印“E”的块的异常,从而有效地吞咽它。代码将继续打印“F”。因为这个原因,简单地捕捉异常并且不做其他事情的块是危险的。

+0

+1绝对正确,如果你想捕捉异常时打印到日志,请确保你用throw抛出它们;而不是扔e;这将抛出一个新的例外。 – ajs410 2010-04-16 15:04:23

3

您捕获异常,所以控制进入catch块,然后在try/catch后继续执行代码。

0

在上面的代码中,只要在打印“D”后它们是非应用程序致命错误,在处理所有可捕获错误时总会打印“F”。

如果没有线程挂起,则此行为将保持一致。

将一个布尔检查添加到“F”,如果抛出错误并且会给出所需的行为,则该检查被抑制。

0

作为一个方面说明,您可以在对象上调用Thread的静态sleep方法,该方法除了您所期望的以外还可以做其他事情。出于这个原因,您不应该在实例上调用静态类方法。

(至于为什么F的印刷,其他人是正确的)

0

我不知道你是怎么知道IllegalMonitorStateException被抛出。您正在使用任何Exception而不是执行诸如e.printStackTrace();之类的操作。

相关问题