2

問題のインターフェイスは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します。

4

0 に答える 0