在做练习是遇到个问题public class Test2 extends Thread {
Object object = new Object();
 public static void main(String[] args){
 
 Test2 test = new Test2();
 test.start();
 }
 
 public void run(){
 
 
try {
object.wait();
}
catch (Exception e) {


}


 System.out.println("123");
 
 
}
}上面是代码
就是在Catch(Exception e) 这里 会抛出异常但是还要打印“123”,
但如果把Exception换成InterruptedException就可以抓住抛出的异常,而不打印“123”
我觉得Exception 是 InterruptedException的superclass可以抓住所有checked exception。
请大家执教

解决方案 »

  1.   

    楼主对try catch的理解还不到位啊也许你在catch中将异常打印出来会更利于你的理解。e.printStackTrace();从打印出的异常信息可以看到,真正抛出的异常是IllegalMonitorStateException,而不是InterruptedException,并且IllegalMonitorStateException也不是InterruptedException的子类,但IllegalMonitorStateException却是Exception的子类。在你catch InterruptedException的时候,异常其实是没有被捕获到的,所以这个异常会直接向上抛出,不会执行之后的语句;
    在你catch Exception的时候,异常被捕获到,然后执行catch中的语句,再之后继续向下执行,所以打印了“123”。你可以好好的看下try catch的作用,java的路很长很坎坷的,一路好走
      

  2.   


    谢谢楼上的解答哈有一点不是很明白 你说异常捕获了反而接着执行下面的语句。 不是应该发现异常后马上中止线程吗?
    我试了试把run 改写
     public void run(){
     
     
        
    try {
    object.wait();
    }
    catch(InterruptedException e){
    e.printStackTrace();
    }
    catch (Exception e) {
    e.printStackTrace();

    }



     System.out.println("123");
     
     
    }"123" 仍然被打印。 你能帮忙解释详细些吗 谢谢
      

  3.   

    public void run() {
    try {
    object.wait();
                            Thread t = new Thread();
    //t.sleep(2000);
    } catch (InterruptedException ie){
    System.err.println("ie");
    catch (IllegalMonitorStateException imse){
    System.out.println("imse");
    }//捕捉这个异常就可以了
    System.out.println("123");
    }