Since Checkstyle 3.2
Restricts throws statements to a specified count. Methods with "Override" or "java.lang.Override" annotation are skipped from validation as current class cannot change signature of these methods.
Rationale: Exceptions form part of a method's interface. Declaring a
method to throw too many differently rooted exceptions makes
exception handling onerous and leads to poor programming practices
such as writing code like catch(Exception ex).
4 is the empirical value which is based on reports that we had for
the ThrowsCountCheck over big projects such as OpenJDK.
This check also forces developers to put exceptions into a hierarchy
such that in the simplest case, only one type of exception need be
checked for by a caller but any subclasses can be caught specifically
if necessary. For more information on rules for the exceptions and
their issues, see Effective Java: Programming Language Guide
Second Edition by Joshua Bloch pages 264-273.
ignorePrivateMethods - allows to skip private methods as they do not cause problems for other classes.
To configure check:
<module name="Checker">
<module name="TreeWalker">
<module name="ThrowsCount"/>
</module>
</module>
Example:
class Test {
public void myFunction() throws CloneNotSupportedException,
ArrayIndexOutOfBoundsException,
StringIndexOutOfBoundsException,
IllegalStateException,
NullPointerException { // violation, max allowed is 4
// body
}
public void myFunc() throws ArithmeticException,
NumberFormatException { // ok
// body
}
private void privateFunc() throws CloneNotSupportedException,
ClassNotFoundException,
IllegalAccessException,
ArithmeticException,
ClassCastException { // ok, private methods are ignored
// body
}
}
To configure the check so that it doesn't allow more than two throws per method:
<module name="Checker">
<module name="TreeWalker">
<module name="ThrowsCount">
<property name="max" value="2"/>
</module>
</module>
</module>
Example:
class Test {
public void myFunction() throws IllegalStateException,
ArrayIndexOutOfBoundsException,
NullPointerException { // violation, max allowed is 2
// body
}
public void myFunc() throws ArithmeticException,
NumberFormatException { // ok
// body
}
private void privateFunc() throws CloneNotSupportedException,
ClassNotFoundException,
IllegalAccessException,
ArithmeticException,
ClassCastException { // ok, private methods are ignored
// body
}
}
To configure the check so that it doesn't skip private methods:
<module name="Checker">
<module name="TreeWalker">
<module name="ThrowsCount">
<property name="ignorePrivateMethods" value="false"/>
</module>
</module>
</module>
Example:
class Test {
public void myFunction() throws CloneNotSupportedException,
ArrayIndexOutOfBoundsException,
StringIndexOutOfBoundsException,
IllegalStateException,
NullPointerException { // violation, max allowed is 4
// body
}
public void myFunc() throws ArithmeticException,
NumberFormatException { // ok
// body
}
private void privateFunc() throws CloneNotSupportedException,
ClassNotFoundException,
IllegalAccessException,
ArithmeticException,
ClassCastException { // violation, max allowed is 4
// body
}
private void func() throws IllegalStateException,
NullPointerException { // ok
// body
}
}
All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.
com.puppycrawl.tools.checkstyle.checks.design