Pitfall Using assert for argument or user input validationsuggest change
A question that occasionally on StackOverflow is whether it is appropriate to use
assert to validate arguments supplied to a method, or even inputs provided by the user.
The simple answer is that it is not appropriate.
Better alternatives include:
- Throwing an IllegalArgumentException using custom code.
- Using the
Preconditionsmethods available in Google Guava library.
- Using the
Validatemethods available in Apache Commons Lang3 library.
This is what the Java Language Specification (JLS 14.10, for Java 8) advises on this matter:
Typically, assertion checking is enabled during program development and testing, and disabled for deployment, to improve performance.
Because assertions may be disabled, programs must not assume that the expressions contained in assertions will be evaluated. Thus, these boolean expressions should generally be free of side effects. Evaluating such a boolean expression should not affect any state that is visible after the evaluation is complete. It is not illegal for a boolean expression contained in an assertion to have a side effect, but it is generally inappropriate, as it could cause program behavior to vary depending on whether assertions were enabled or disabled.
In light of this, assertions should not be used for argument checking in public methods. Argument checking is typically part of the contract of a method, and this contract must be upheld whether assertions are enabled or disabled.
A secondary problem with using assertions for argument checking is that erroneous arguments should result in an appropriate run-time exception (such as
NullPointerException). An assertion failure will not throw an appropriate exception. Again, it is not illegal to use assertions for argument checking on public methods, but it is generally inappropriate. It is intended that
AssertionError never be caught, but it is possible to do so, thus the rules for try statements should treat assertions appearing in a try block similarly to the current treatment of throw statements.