要解释我的问题,请查看下面的java代码。
public interface Parent {
public void method();
}
public class Child implements Parent {
public void method() throws Exception {
}
}
正如大家所说,这将无法编译,因为Child类的方法声明了未在接口中指定的异常。 运行时行为怎么样?我遇到了一个条件,这个组合不会在运行时抛出异常,方法工作正常。 这是正确的行为,(我的意思是这个带有异常子句控制的方法签名是在编译时完成的,在运行时抛出子句不被视为方法签名)或者我在这里遗漏了什么?
我看到我的问题不明确。
让我再试一次;
上面的类组合在运行时工作,当然还要编译Child类正确版的Parent类。
答案 0 :(得分:1)
如果编译失败,将永远不会有运行时。您可以尝试抛出RuntimeException而不是Exception(包括catched Exceptions。)
答案 1 :(得分:0)
您可以更改界面中的方法声明,以清楚地表明该方法可能会抛出某些类型异常,或者您的实现始终可以抛出特定于您的实现的RuntimeException
。
答案 2 :(得分:0)
因此,在编译时,规则是强制执行的 - 当你重写方法时,你不能让方法抛出一个比super方法(你要覆盖的方法)更普遍的例外的规则。
但是,正如我认为您已经发现的那样,此约束仅由编译器强制执行,并且不会在运行时再次检查。如果更改超类异常以使其更通用,则编译代码,提取已编译的子类并将其放在一边,然后将超类更改回较不常见的异常并提取该类。然后将这两个类一起运行,代码将运行。
这里的问题是一些约束只在编译时强制执行,其他约束在编译时强制执行 - 有些只能在运行时强制执行。并且,在编译时已经检查过原因约束时,不会再次检查原因约束是为了提高性能。