方法覆盖throws子句运行时行为

时间:2014-01-02 08:16:47

标签: java override method-overriding

要解释我的问题,请查看下面的java代码。

public interface Parent {
    public void method();
}

public class Child implements Parent {
    public void method() throws Exception {
    }
}

正如大家所说,这将无法编译,因为Child类的方法声明了未在接口中指定的异常。 运行时行为怎么样?我遇到了一个条件,这个组合不会在运行时抛出异常,方法工作正常。 这是正确的行为,(我的意思是这个带有异常子句控制的方法签名是在编译时完成的,在运行时抛出子句不被视为方法签名)或者我在这里遗漏了什么?

我看到我的问题不明确。

让我再试一次;

上面的类组合在运行时工作,当然还要编译Child类正确版的Parent类。

3 个答案:

答案 0 :(得分:1)

如果编译失败,将永远不会有运行时。您可以尝试抛出RuntimeException而不是Exception(包括catched Exceptions。)

答案 1 :(得分:0)

您可以更改界面中的方法声明,以清楚地表明该方法可能会抛出某些类型异常,或者您的实现始终可以抛出特定于您的实现的RuntimeException

答案 2 :(得分:0)

因此,在编译时,规则是强制执行的 - 当你重写方法时,你不能让方法抛出一个比super方法(你要覆盖的方法)更普遍的例外的规则。

但是,正如我认为您已经发现的那样,此约束仅由编译器强制执行,并且不会在运行时再次检查。如果更改超类异常以使其更通用,则编译代码,提取已编译的子类并将其放在一边,然后将超类更改回较不常见的异常并提取该类。然后将这两个类一起运行,代码将运行。

这里的问题是一些约束只在编译时强制执行,其他约束在编译时强制执行 - 有些只能在运​​行时强制执行。并且,在编译时已经检查过原因约束时,不会再次检查原因约束是为了提高性能。