問題のインターフェイスは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は正しいです。
そして、実装した場合、コードをコンパイルするために throw する必要がないことを思い出しましたCloneable
。投げるのに。_CloneNotSupportedException
Object
.clone()
実際、@Override
clone() をスローするように宣言しないCloneableNotSupportedException
場合でも、コンパイルされます。
しかし。
それから私はこれを試しました:
final Callable<Void> callable = new Callable<Void>()
{
@Override
public Void call()
{
return null;
}
}
Callable
スローするはずですException
が、これまでのところコンパイルされています。ただし、次の場合:
callable.call();
これはコンパイルエラーです...
何が何?
編集OK、大きな違いがあります。定義Cloneable
しませんclone()
。Object
します。