The interface in question is FileVisitor, which defines this method:
FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
throws IOException;
My really simple implementation is this:
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
}
At the point marked <-- HERE in this code extract, strangely enough, IDEA (since this is my IDE of choice) tells me that declaring that exception is unnecessary...
Since IDEA is not without bugs, I decided to try it out. I removed the exception and it compiled! So, IDEA is right.
And then I recalled that if you implemented Cloneable your were not required to throw CloneNotSupportedException, which is also a checked exception, for your code to compile (not that this is the canonical reommendation, of course). Even though Object's .clone() throws it.
And indeed, when you @Override clone() and do not declare it to throw CloneableNotSupportedException, it still compiles.
BUT.
Then I tried this:
final Callable<Void> callable = new Callable<Void>()
{
@Override
public Void call()
{
return null;
}
}
Callable is supposed to throw Exception but so far it compiles; however, if I:
callable.call();
then this is a compilation error...
What is what?
EDIT OK, there is a MAJOR difference; Cloneable does not define clone(); Object does.