这是我的代码块.
class Alpha{
public void Gamma() {
System.out.println("Alphas");
}
}
class Beta extends Alpha{
public void Gamma() throws Exception //Line 1
{
try {
System.out.println("Betas");
} catch(Exception e) {
System.out.println("Exception caught");
} finally {
System.out.println("xfg");
}
}
public static void main(String[] args) throws Exception {
Alpha g = new Beta();
g.Gamma();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为我在Line1中添加了"throws".
编译器抱怨重写的方法不能抛出异常.
为什么这样 ?.
为什么重写的方法不能抛出异常?
因为我可以通过在子类的实现中添加n行代码来覆盖基类中的方法.
这些添加的代码可以抛出异常,为什么我不能在重写方法中使用"throws"?
Boh*_*ian 24
重写的方法可以抛出异常,只要被覆盖的方法也抛出相同的异常.您无法引入新的例外.
那你为什么不能引入一个新的例外呢?
OOP的核心概念之一是使用抽象类型,并且所有子类型都可以被视为抽象类型.见Liskov替代原则
您无法引入更广泛行为的原因是,如果抽象类型(超类或接口)中的方法不会抛出异常并且您将对象称为该类型,则会出现意外行为:
Alpha alpha = new Beta();
// At this point, the compiler knows only that we have an Alpha
alpha.myMethod();
Run Code Online (Sandbox Code Playgroud)
如果阿尔法的myMethod()不抛出一个异常,但测试版的呢,我们可以得到在上面的代码意外的异常.
子类overriden方法只能抛出(Declare)未经检查的异常,如ArrayIndexOutOfBoundsException.
但是您不能抛出(声明)已检查的异常.像IOException.
verriden方法的示例抛出异常Java
class A{
public void show(){
// some code here
}
}
class B extends A{
public void show() throws ArrayIndexOutOfBoundsException{
// some code here
}
}
Run Code Online (Sandbox Code Playgroud)
希望这些可以帮到你.
| 归档时间: |
|
| 查看次数: |
27269 次 |
| 最近记录: |