黑马程序员技术交流社区
标题:
异常
[打印本页]
作者:
李建锋
时间:
2011-12-7 00:18
标题:
异常
本帖最后由 李建锋 于 2011-12-8 14:58 编辑
当一个方法被覆盖是,覆盖它的方法为什么必须抛出他的异常或其子类!
作者:
刘海涛
时间:
2011-12-7 08:04
本帖最后由 刘海涛 于 2011-12-7 10:14 编辑
这是java中的一种规定,也是避免程序员犯错,在论坛有帖。这里面写得很清楚了。
地址:
http://bbs.itheima.com/forum.php ... amp;page=1#pid24731
作者:
申绪胜
时间:
2011-12-7 09:57
假设A extends Exception , C extends Exception , B exception A
如果父类的函数中有个A异常 , 那么子类必须要么抛A要么抛B,不能抛C
我们假设可以抛C
比如有个Test类有个方法需要传进来一个父类对象当参数,要调用父类的一个方法,父类的方法有异常,那么这个Test类也许会catch(A a)一下,
但如果你要传进来一个子类,根据多态,也可以调用相应方法,但执行的是子类的方法,这时候你抛出一个C
那么catch接收不了 程序就报错了
明白了吗
所以 如果子类真的有超过父类异常的范围 只能自己在内部try catch解决了 不能抛了
作者:
赵燕燕
时间:
2011-12-7 11:21
class Exception1 extends Exception{}
class Exception11 extends Exception1{}
class Exception2 extends Exception{}
class Fu
{
void show()throws Exception1
{}
public void run(Fu f)
{
try
{
f.show();//当传入子类对象的引用时,运行时调用的是子类中的show方法,
//子类抛出了Exception2异常,这时下面的catch无法捕获该异常。这就出现了问题,导致旧代码(父类的方法)无法再使用。
}
catch(Exception1 e)//这里只能捕获Exception1、 Exception11
{}
}
}
class Zi extends Fu
{
void show()throws Exception2//错误,编译无法通过。java不允许这样做。
{}
}
class Demo4
{
public static void main(String[] args)
{
Fu f=new Fu();
f.run(new Zi());
}
}
Fu类是旧代码,为了扩展功能、优化代码等操作,添加了Zi类,旧代码是不能改动。
Zi类show方法覆盖了父类中的方法,并抛出了父类不能捕获的异常。这导致旧代码不能使用。
为了避免这种错误,java中规定子类覆盖父类方法时,只能抛出父类被覆盖方法抛出的异常或其子异常。
作者:
admin
时间:
2011-12-8 11:19
黑马论坛导航栏下面有个搜索,提问时大家可以先搜索下!
作者:
李建锋
时间:
2011-12-8 14:57
楼上讲的非常精彩!兄弟受益匪浅·!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2