日期:2014-05-20  浏览次数:20627 次

求救:关于异常的题目
我的程序:
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异常,那么代码都有可能被执行到,就不会出错了