面试题答案
一键面试-
异常处理规则
- 子类重写父类抽象方法时,不能抛出比父类抽象方法声明的受检异常更宽泛的异常类型。例如,如果父类方法声明抛出
IOException
,子类重写方法不能抛出Exception
(因为Exception
比IOException
更宽泛)。 - 子类重写方法可以抛出与父类抽象方法声明的受检异常相同类型的异常,或者是其父类抽象方法声明的受检异常的子类类型异常。例如,如果父类方法声明抛出
IOException
,子类重写方法可以抛出FileNotFoundException
(因为FileNotFoundException
是IOException
的子类)。 - 子类重写方法也可以不抛出任何受检异常,即使父类抽象方法声明抛出了受检异常。
- 子类重写父类抽象方法时,不能抛出比父类抽象方法声明的受检异常更宽泛的异常类型。例如,如果父类方法声明抛出
-
父类抽象方法声明抛出某种受检异常,子类重写该方法时的情况
- 能否改变异常类型:
- 不能改变为更宽泛的异常类型。如上述所说,不能将父类声明的
IOException
改变为Exception
。 - 可以改变为子类类型异常,例如父类声明
IOException
,子类可以抛出FileNotFoundException
。
- 不能改变为更宽泛的异常类型。如上述所说,不能将父类声明的
- 能否不抛出异常:可以不抛出异常。
- 能否改变异常类型:
-
代码示例
// 抽象父类
abstract class Parent {
abstract void someMethod() throws IOException;
}
// 子类
class Child extends Parent {
// 子类重写方法抛出相同类型异常
@Override
void someMethod() throws IOException {
// 具体实现
throw new IOException();
}
}
class AnotherChild extends Parent {
// 子类重写方法抛出子类类型异常
@Override
void someMethod() throws FileNotFoundException {
// 具体实现
throw new FileNotFoundException();
}
}
class YetAnotherChild extends Parent {
// 子类重写方法不抛出异常
@Override
void someMethod() {
// 具体实现
}
}