ThrowsCount

Since Checkstyle 3.2

Description

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.

Properties

name description type default value since
max Specify maximum allowed number of throws statements. int 4 3.2
ignorePrivateMethods Allow private methods to be ignored. boolean true 6.7

Examples

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
    }

}
        

Example of Usage

Violation Messages

All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.

Package

com.puppycrawl.tools.checkstyle.checks.design

Parent Module

TreeWalker