为什么我可以选择删除throws子句,即使我继承的接口定义了它?

时间:2014-12-18 20:43:24

标签: java exception-handling cloneable

有问题的界面是FileVisitor,它定义了这种方法:

FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
    throws IOException;

我真正简单的实现是:

public final class FailFastDeletionVisitor
    implements FileVisitor<Path>
{
    private final FileSystemProvider provider;

    public FailFastDeletionVisitor(final Path victim)
    {
        provider = Objects.requireNonNull(victim).getFileSystem().provider();
    }

    @Override
    public FileVisitResult preVisitDirectory(final Path dir,
        final BasicFileAttributes attrs)
        throws IOException // <-- HERE
    {
        return FileVisitResult.CONTINUE;
    }

    // etc etc    
}

在此代码提取中标记为<-- HERE的位置,奇怪的是,IDEA(因为这是我选择的IDE)告诉我,声明异常是不必要的......

由于IDEA并非没有错误,我决定尝试一下。我删除了异常并编译了!所以,IDEA是对的。

然后我回想一下,如果你实现了Cloneable,则不需要抛出CloneNotSupportedException,这也是 一个已检查的异常,代码要编译(不是这当然是规范的推荐)。即使Object's .clone() throws it

事实上,当你@Override clone()并且没有声明它抛出CloneableNotSupportedException时,它仍会编译。

BUT。

然后我尝试了这个:

final Callable<Void> callable = new Callable<Void>()
{
    @Override
    public Void call()
    {
        return null;
    }
}

Callable应该抛出Exception,但到目前为止它已编译;但是,如果我:

callable.call();

那么这是编译错误......

什么是什么?


编辑好的,有一个主要区别; Cloneable 定义clone(); Object确实如此。

0 个答案:

没有答案