Wiki Markup |
---|
A method should neverrarely throw {{RuntimeException}} or {{Exception}}. This is because handling these exceptions requires catching {{RuntimeException}}, which is forbidden in [EXC32-J. Catch specific exceptions as opposed to the more general RuntimeException]. Moreover, throwing a {{RuntimeException}} can lead to subtle errors such as a caller who fails to retrieve a return value from an offending method, is unable to check for appropriate feedback. The Java Language Specification (Section 8.4.7 Method Body) allows the declaration of a method with a return type without making it necessary to return a value if a runtime exception is thrown from within the method \[[JLS 05|AA. Java References#JLS 05]\]. |
Instead, always throw an exception prefer throwing a more specific exception, subclassed from Exception
. It is permissible to construct an exception class specifically for a single throw
statement.
Noncompliant Code Example
The following function This noncompliant code example takes a string and returns true
if it consists of a capital letter followed by lowercase letters. To handle corner cases, it checks for the exceptional conditions and throws exceptions if they are likely to prevent disrupt the normal analysisoperation.
Code Block | ||
---|---|---|
| ||
boolean isCapitalized(String s) { if (s == null) { throw new RuntimeException("Null String"); } if (s.equals("")) { return true; } String first = s.substring( 0, 1); String rest = s.substring( 1); return (first.equals( first.toUpperCase()) && rest.equals( rest.toLowerCase())); } |
To handle the case of passing in a null
string parameter, code calling this function method may require catching RuntimeException
, which is a violation of EXC32-J. Catch specific exceptions as opposed to the more general RuntimeException.
Compliant Solution
An exception specifically devoted to the error is more appropriateThis compliant solution devotes a specific exception (NullPointerException
) to denote the particular exceptional condition.
Code Block | ||
---|---|---|
| ||
boolean isCapitalized(String s) { if (s == null) { throw new NullPointerException(); } if (s.equals("")) { return true; } String first = s.substring( 0, 1); String rest = s.substring( 1); return (first.equals( first.toUpperCase()) && rest.equals( rest.toLowerCase())); } |
Noncompliant Code Example
This noncompliant code snippet example uses a broad Exception
class in the throws
declaration of the method.
...
Code Block | ||
---|---|---|
| ||
private void doSomething() throws IOException { //... } |
Using instanceof
to check for narrower exceptions in a general catch
block is not always helpful because it is usually impossible to enumerate all the exceptions that the code is capable of throwing.
Risk Assessment
Throwing RuntimeException
, and Exception
prevents classes from catching the intended exception exceptions without catching other unintended exceptions as well.
...