使用新检查的异常覆盖Java接口

don*_*ton 4 java overriding exception-handling interface exception

假设在Java中,我使用的是一个相当普遍的预先存在的接口

public interface Generator {
    public String generate();
}
Run Code Online (Sandbox Code Playgroud)

我有自己的课

public class FromFileGenerator implements Generator {
    ...
    public String generate() throws FileNotFoundException {
        String output = //read from some file
        return file;
    }
}
Run Code Online (Sandbox Code Playgroud)

Java编译器对我大吼大叫,因为generate()的实现包含未在原始签名中指定的异常(FileNotFoundException).但是,显然异常不属于接口,但在实现类中也不能忽略.如果不是默默地失败,怎么能解决这个问题呢?

Ted*_*opp 13

您不能将已检查的异常添加到隐藏,覆盖或实现其他方法的方法的声明中.您将需要捕获方法中的异常并对其执行其他操作(例如返回null,或抛出未经检查的异常,可能包装已检查的异常).

Java语言规范,§8.4.8.3:

覆盖或隐藏另一个方法的方法(包括实现接口中定义的抽象方法的方法)可能不会被声明为抛出比重写或隐藏方法更多的已检查异常.


Aja*_*rge 5

接口是一个契约

在此输入图像描述

所以你需要预先定义它。

因此,您可以尝试,在方法体内捕获或修改契约。


Nat*_*hes 3

您可以将实现异常包装在未经检查的异常中并抛出:

public class FromFileGenerator implements Generator {
    ...
    public String generate() {
        try {
            String output = //read from some file
            return file;
        } catch (IOException ioe) {
            throw new RuntimeException(ioe);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)