【问题标题】:Implementation method Throws exception but interface method don't define as it throws exception实现方法抛出异常但接口方法未定义,因为它抛出异常
【发布时间】:2014-08-26 10:49:42
【问题描述】:

实现接口时,接口方法不抛出异常是完全合法的,但实现类方法可以抛出异常。

接口定义

public interface exceptionNotDefined {
    void doNotThrowException();
}

实现类

public class exceptionNotDefinedImpl implements exceptionNotDefined {
    @Override
    public void doNotThrowException() throws RuntimeException{

    }
}

这背后的逻辑是什么,Java 语言规范的哪一部分处理了这个问题。

【问题讨论】:

  • 仅供参考:RunTimeException(s) 不需要明确定义为 throws。只有检查的异常应该是。
  • @T.J - s/应该/必须是/p。将throws 用于未经检查的异常可能是有益的。它可以帮助记录 API。

标签: java exception jls


【解决方案1】:

...这背后的逻辑是什么

这个逻辑最好用“可替代性”这个词来描述。

当一个接口方法被声明为“抛出”一个已检查异常时,它表示调用者必须处理异常(通过捕获它或通过声明它......或超类型)。

当您在不引发异常的情况下实现该方法时,该方法调用是可替代的。如果异常不会被抛出,具有处理异常可能性的代码的调用者可以应对。

另一个问题是,在实现类中,您将方法声明为 throwing RuntimeExceptionRuntimeException 及其子类是unchecked 异常,Java 语言说调用者不需要处理 unchecked 异常。所以,其实throws RuntimeException除了记录API设计者的意图之外,并没有什么实际作用。


...Java 语言规范的哪一部分处理这个问题。

JLS Section 11.2 概括地涵盖了大部分内容,有关方法覆盖的具体规则(包括 throws 子句)在 JLS 8.4.8.3 中给出。

【讨论】:

    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多