我的程序:
class A extends Exception { }
class B extends A { }
public class Human {
public static void main(String[] args) {
try {
throw new B();
}catch(A a) {
System.out.println("Catch A");
}catch(B b) {
System.out.println("Catch B");
}
}
}
编译出错:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.E:\java>javac Human.java
Human.java:10: 已捕捉到异常 B
                }catch(B b) {
                 ^
1 错误E:\java>
请问问题出在哪里了?这个程序是浙江大学java视频讲座里的例子,用的是jdk1.4,我用的是jdk1.6

解决方案 »

  1.   

    因为B继承自A,也就是说B“是一个”A,你catch(A)了,自然B也就catch到了,下面加来一个catch(B)就是多余的了。如果把两个catch互换位置,则可以。因为catch(B),不一定能catch到所有A(因为A可能还有其它子类)。
      

  2.   

    B是A的子类。
    所以如果是B异常。在A就已经被捕获了。
    }catch(B b) {
     System.out.println("Catch B");
    }
    根本不会被执行。
    就像Exception一定要放到最后一样。你把A和B异常的捕获换一下地方就可以了
      

  3.   

    恩,异常B是A的子类,就是说B也是异常A的一种,如果发生了异常B,在捕获异常A的地方肯定会被捕获到,所以捕获异常B的地方永远都不会被执行到。Java编译器可以判断出这一点,永远不会被执行到的代码不需要存在,所以提示你出错。这里这里A的范围比B大,A包含B,顺序反过来的话先捕获B,那么还有一部分异常是A异常不是B异常,那么代码都有可能被执行到,就不会出错了
      

  4.   

    楼上的,这属于Java编译器的优化功能,很早就有了。
      

  5.   

    Java编译器可以判断出这一点,永远不会被执行到的代码不需要存在,所以提示你出错。
    这属于Java编译器的优化功能, james gosling厉害!!!!