一、异常与重写
重写方法不能抛出"超过原方法所抛出异常类型范围"的异常,重写方法也可以选择不抛出异常。
如:原方法抛出了一只狗,重写方法不能抛出一只大象,也不能抛出一只动物;重写方法可以抛出一只狗,或者一只德国牧羊犬。
class A {
public void method() throws IOException {
//···
}
}
/* 正确,抛小了可以
* FileNotFoundException是IOException的子类
*/
class B1 extends A {
@Override
public void method() throws FileNotFoundException {
//···
}
}
/* 正确,抛小了可以
* FileLockInterruptionException也是IOException的子类
*/
class B2 extends A {
@Override
public void method() throws FileNotFoundException, FileLockInterruptionException {
//···
}
}
/* 错误,抛大了不行
* Exception是IOException的父类
*/
class B3 extends A {
@Override
public void method() throws Exception {
//···
}
}
/* 正确,可以不抛异常
* method()方法内部是否要try-catch
* 完全取决于method()方法内部的代码是否有可能发生异常
*/
class B4 extends A {
@Override
public void method() {
//···
}
}
/* 正确,可以抛出多余的RuntimeException异常
* 虽然超出IOException的范畴,但RuntimeException属于可逮可不逮的异常,
* 想抛也无妨
* ArithmeticException是RuntimeException的子类,也可以抛
*/
class B5 extends A {
@Override
public void method() throws IOException, RuntimeException, ArithmeticException {
//···
}
}
/* 正确,不抛IOException是可以的,
* 再抛一个可逮可不逮的RuntimeException也是可以的
*/
class B6 extends A {
@Override
public void method() throws RuntimeException {
//···
}
}
/* 错误,抛出多余的异常不行
* MyException继承自Exception,Exception作为非RuntimeException的父类,
* 所以Exception必须当做"不逮就得抛、不抛就得逮"的异常,MyException也是这种异常,
* 往外抛这种异常,超出了IOException的范畴
*/
class B7 extends A {
@Override
public void method() throws IOException, MyException {
//···
}
}
class MyException extends Exception {
}
总结:
1)不能往大了抛,只能往小了抛,或者抛一样的,或者不抛。
2)可以抛RuntimeException及其子类异常。