首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

为何子类中的覆盖方法只能抛出和基类方法相同或者更少的错误

2013-08-10 
为何子类中的覆盖方法只能抛出和基类方法相同或者更少的异常为何子类中的覆盖方法只能抛出和基类方法相同

为何子类中的覆盖方法只能抛出和基类方法相同或者更少的异常
为何子类中的覆盖方法只能抛出和基类方法相同或者更少的异常?
我实在是笨,想不通,请各位指教!!!
[解决办法]
A a = new B();
a.test();

编译时调用 类A 中test(),抛出异常,
实际调用的是 类B 中的 test(),
如果类B中的 方法抛出了 更大的异常,这样就无法捕获了。
[解决办法]
多态性的考虑,比如下面这种写法的代码,一个抽象类,然后一个实现类:
abstract class Foo
{
abstract void hello();
}

class FooImpl extends Foo
{void hello()
{
}
}

我们用的时候,通常会这样用:
Foo f=new FooImpl();
f.hello();

如果FooImpl里实现的hello方法抛了异常,而Foo定义的hello实际没throws异常的,那上写这个调用方法,定义的f是Foo类型的,Foo类里的hello方法没异常,不是就冲突了吗?

不知这样你能理解不。
[解决办法]



import java.io.File;


public class Test{
public static void main (String[]args){
try{
File f = new File("D:\\test.txt");//NullPointerException
System.out.println(f.exists());//SecurityException

}catch(Exception e){
//输出异常[1]
}catch(NullPointerException ex){

//不再输出,因为异常已经被父异常捕获.[2]
}catch(SecurityException se){

//不再输出,因为异常已经被父异常捕获.[3]
}
//如果要正常输出异常,需要将[1]放在最后面,形如下面这样:

/*
try{
File f = new File("D:\\test.txt");//NullPointerException
System.out.println(f.exists());//SecurityException

}catch(NullPointerException ex){

}catch(SecurityException se){

}catch(Exception e){
//输出异常[1]
}



*/

}


}


父异常会覆盖子异常.
[解决办法]
因为面向接口编程
如果子类异常不是父类的异常或是起子类的话
这玩意就难办了!
你怎么处理异常!
接口中抛IO异常
结果实现时抛文件异常
这说的通吗?
[解决办法]
同意4楼,接口定义的是某种规范或约束,相当于签了合同,具体事情怎么做不管,但不能违反法律和合同条款。
接口的实现类的可见性,异常等范围都要小于等于接口就是一个接口的“法律”,或者说约束条件。
如果没有这个约束,程序将不可预见和控制。
主要是两点原因,1.面向接口编程时,是不考虑具体实现类的(可能有很多实现,在处理业务逻辑时才去实现)
2.从异常的捕获方式来说,try{}catch(SQLException e){}可以捕获到指定的异常及其子异常。


因此,如存在接口A的方法am1抛出SQL异常,对于面向接口的编程来说,此类异常是可预见的,可以定制一些对应的异常捕获和处理方式。
如果一个实现类抛出SQL异常,或者SQL异常的子异常(如BatchUpdateException),那就是可以预期的,可以捕获并处理。
但如果实现类抛出的是IOException,不在SQLExcepton的范围,你无法预知,所以也是无法处理的。

热点排行
Bad Request.