重写的方法不能抛出异常Java

Und*_*Dog 14 java

这是我的代码块.

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()不抛出一个异常,但测试版的,我们可以得到在上面的代码意外的异常.


PVH*_*PVH 7

子类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)

希望这些可以帮到你.