在实现接口时,接口方法不会抛出异常是完全合法的,但实现类方法可以抛出异常。
接口定义
public interface exceptionNotDefined {
void doNotThrowException();
}
实施课程
public class exceptionNotDefinedImpl implements exceptionNotDefined {
@Override
public void doNotThrowException() throws RuntimeException{
}
}
这背后的逻辑是什么,以及Java语言规范的哪个部分处理这个问题。
答案 0 :(得分:3)
......这是
背后的逻辑
逻辑最好用“#34;替代性”这个词来描述。
当接口方法被声明为" throw"一个检查异常,它说调用者必须处理异常(通过捕获它或通过声明它...或超类型)。
当您在不抛出异常的情况下实现该方法时,方法调用是可替换的。如果异常不被抛出,那么具有处理异常可能性的代码的调用者可以应对。
另一个问题是,在实现类中,您将方法声明为抛出RuntimeException
。 RuntimeException
及其子类是未经检查的异常,Java语言表示调用者不需要处理未经检查的异常。事实上,除了记录API设计者的意图外,throws RuntimeException
没有实际效果。
... Java语言规范的哪个部分涉及此问题。
JLS部分11.2涵盖了大部分内容,并且在JLS 8.4.8.3中给出了有关方法覆盖的具体规则(包括throws
子句)。