An exception in a throws declaration in Java is superfluous if it is:
RuntimeException, or one of its descendants
void foo() throws MyException, MyException {} // Noncompliant; should be listed once
void bar() throws Throwable, Exception {} // Noncompliant; Exception is a subclass of Throwable
void baz() throws RuntimeException {} // Noncompliant; RuntimeException can always be thrown
void foo() throws MyException {}
void bar() throws Throwable {}
void baz() {}
The rule will not raise any issue for exceptions that cannot be thrown from the method body:
default methods throw, have empty bodies, or a single return statement .
class A extends B {
@Override
void doSomething() throws IOException {
compute(a);
}
public void foo() throws IOException {}
protected void bar() throws IOException {
throw new UnsupportedOperationException("This method should be implemented in subclasses");
}
Object foobar(String s) throws IOException {
return null;
}
/**
* @throws IOException Overriding classes may throw this exception if they print values into a file
*/
protected void print() throws IOException { // no issue, method is overridable and the exception has proper javadoc
System.out.println("foo");
}
}