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

时间:2009-12-14 00:18:25

标签: java multithreading exception

鉴于此代码:

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代码之外调用wait()时会抛出synchronized。为什么达到F的印刷声明?我相信线程堆栈随后会爆炸,但程序应该将控制传递给它的主堆栈。

这是对的吗?

5 个答案:

答案 0 :(得分:6)

您正在捕获打印“E”的块中的异常,从而有效地吞咽它。然后代码将继续打印“F”。由于这个原因,简单地捕获异常并且不执行任何其他操作的块是危险的。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

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

向“F”添加一个布尔检查,如果抛出错误,该布料将被禁止,这将为您提供所需的行为。

答案 3 :(得分:0)

作为旁注,你在对象上调用Thread的静态sleep方法,这会做出你预期的其他事情。因此,您不应该在实例上调用静态类方法。

(至于F印刷的原因,其他人都是正确的)

答案 4 :(得分:0)

我想知道你是怎么知道IllegalMonitorStateException被抛出的。您正在使用任何Exception而不使用e.printStackTrace();