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