A method should never Methods must not throw RuntimeException
, Exception
, or Exception
. This is because handling these Throwable
. Handling these exceptions requires catching RuntimeException
, which is forbidden in EXC32disallowed by ERR08-J. Do not catch NullPointerException or any of its ancestors. Moreover, throwing a RuntimeException
. can lead to subtle errors; for example, a caller cannot examine the exception to determine why it was thrown and consequently cannot attempt recovery.
Methods can throw a specific Instead, always throw an exception subclassed from Exception
or RuntimeException
. It Note that it is permissible to construct an exception class specifically for a single throw
statement.
Noncompliant Code Example
The following function takes isCapitalized()
method in this noncompliant code example accepts a string and returns true if it when the string consists of a capital letter succeeded followed by lowercase letters. To handle corner cases, it checks for them and throws exceptions if they would prevent normal analysisThe method also throws a RuntimeException
when passed a null string argument.
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())); } |
In order to handle the case of passing in a null string, code calling this function would have to catch RuntimeException
, which violates EXC32A calling method must also violate ERR08-J. Do not catch NullPointerException or any of its ancestors to determine whether the RuntimeException
was thrown.
Compliant Solution
An exception specifically devoted to the error would be more appropriate.This compliant solution throws NullPointerException
to denote the specific 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())); } |
Note that the null check is redundant; if it were removed, the subsequent call to s.equals("")
would throw a NullPointerException
when s
is null. However, the null check explicitly indicates the programmer's intent. More complex code may require explicit testing of invariants and appropriate throw
statements.
Noncompliant Code Example
This noncompliant code example specifies the Exception
class in the throws
clause of the method declaration for the doSomething()
method:
Code Block | ||
---|---|---|
| ||
private void doSomething() throws Exception {
//...
}
|
Compliant Solution
This compliant solution declares a more specific exception class in the throws
clause of the method declaration for the doSomething()
method:
Code Block | ||
---|---|---|
| ||
private void doSomething() throws IOException {
//...
}
|
Exceptions
ERR07-J-EX0: Classes that sanitize exceptions to comply with a security policy are permitted to translate specific exceptions into more general exceptions. This translation could potentially result in throwing RuntimeException
, Exception
, or Throwable
in some cases, depending on the requirements of the security policy.
Risk Assessment
Throwing RuntimeException
, Exception
, or General
Throwable
prevents classes from catching your exception the intended exceptions without catching other unintended exceptions as well.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|
ERR07-J |
Low |
Likely |
Medium | P6 | L2 |
Automated Detection
...
TODO
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
References
Wiki Markup |
---|
\[[MITRE 09|AA. Java References#MITRE 09]\] [CWE ID 397|http://cwe.mitre.org/data/definitions/397.html] "Declaration of Throws for Generic Exception" |
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
CodeSonar |
| JAVA.STRUCT.EXCP.BROAD | Broad Throws Clause (Java) | ||||||
Parasoft Jtest |
| CERT.ERR07.NTX CERT.ERR07.NTERR | Avoid declaring methods to throw general or unchecked Exception types Do not throw exception types which are too general or are unchecked exceptions | ||||||
SonarQube |
| S112 | Generic exceptions should never be thrown |
Related Guidelines
Bibliography
...
EXC03-J. Try to recover gracefully from system errors 10. Exceptional Behavior (EXC) EXC30-J. Do not exit abruptly from a finally block