有问题的接口是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
了你不需要 throw CloneNotSupportedException
,这也是一个检查的异常,你的代码可以编译(当然,这不是规范的建议)。尽管Object
's .clone()
throws it。
实际上,当您@Override
clone() 并且不将其声明为 throwCloneableNotSupportedException
时,它仍然可以编译。
但。
然后我尝试了这个:
final Callable<Void> callable = new Callable<Void>()
{
@Override
public Void call()
{
return null;
}
}
Callable
应该抛出Exception
,但到目前为止它可以编译;但是,如果我:
callable.call();
那么这是一个编译错误...
什么是什么?
编辑好的,有很大的不同;Cloneable
没有定义;_ 做。clone()
Object