| Wiki Markup |
|---|
Never use {{return}}, {{break}}, {{continue}}, or {{throw}} statements within a {{finally}} block. When program execution enters a {{try}} block that has a {{finally}} block, the {{finally}} block always executes, regardless of whether the {{try}} block (or any associated {{catch}} blocks) |
execute executes to completion. Statements that cause the {{finally}} block to terminate abruptly also cause the {{try}} block to terminate abruptly |
, and consequently mask any exception thrown from the {{try}} or {{catch |
blocks (JLS 2005)}} blocks \[[JLS 2005|http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20.2]\]. |
Noncompliant Code Example
In this noncompliant code example, the finally block completes abruptly because of a return statement in the finally block.
| Code Block |
|---|
|
class TryFinally {
private static boolean doLogic() {
try {
throw new IllegalStateException();
} finally {
System.out.println("Uncaught Exception");
return true;
}
}
public static void main(String[] args) {
doLogic();
}
}
|
The IllegalStateException is suppressed by the abrupt termination of the finally block caused by the return statement.
...
| Code Block |
|---|
|
class TryFinally {
private static boolean doLogic() {
try {
throw new IllegalStateException();
} finally {
System.out.println("Caught Exception");
}
// Any return statements must go here; applicable only when exception is thrown conditionally
}
public static void main(String[] args) {
doLogic();
}
}
|
Risk Assessment
Exiting abruptly from a finally block masks any exceptions thrown inside the associated try and catch blocks.
...
| Wiki Markup |
|---|
\[[Bloch 2005|AA. Bibliography#Bloch 05]\] Puzzle 36: Indecision
\[[Chess 2007|AA. Bibliography#Chess 07]\] 8.2 Managing Exceptions, "The Vanishing Exception"
\[[JLS 2005|AA. Bibliography#JLS 05]\] [Section 14§14.20.2, Execution of try-catch-finally|http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20.2]
\[[MITRE 2009|AA. Bibliography#MITRE 09]\] [CWE ID -705|http://cwe.mitre.org/data/definitions/705.html] "Incorrect Control Flow Scoping", and [CWE ID -584|http://cwe.mitre.org/data/definitions/584.html] "Return Inside Finally Block" |
...