有问题的界面是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
确实如此。