我的程序:
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
------解决方法--------------------------------------------------------
因为B继承自A,也就是说B'是一个'A,你catch(A)了,自然B也就catch到了,下面加来一个catch(B)就是多余的了。
如果把两个catch互换位置,则可以。因为catch(B),不一定能catch到所有A(因为A可能还有其它子类)。
------解决方法--------------------------------------------------------
B是A的子类。
所以如果是B异常。在A就已经被捕获了。
}catch(B b) {
System.out.println( "Catch B ");
}
根本不会被执行。
就像Exception一定要放到最后一样。
你把A和B异常的捕获换一下地方就可以了
------解决方法--------------------------------------------------------
恩,异常B是A的子类,就是说B也是异常A的一种,如果发生了异常B,在捕获异常A的地方肯定会被捕获到,所以捕获异常B的地方永远都不会被执行到。Java编译器可以判断出这一点,永远不会被执行到的代码不需要存在,所以提示你出错。
这里这里A的范围比B大,A包含B,顺序反过来的话先捕获B,那么还有一部分异常是A异常不是B异常,那么代码都有可能被执行到,就不会出错了