| 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) 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|http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20.2]\]. | 
In this noncompliant code example, the finally block completes abruptly because of a return statement in the 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.
This compliant solution removes the return statement from the finally 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();
  }
}
 | 
Exiting abruptly from a finally block masks any exceptions thrown inside the associated try and catch blocks.
| Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level | 
|---|---|---|---|---|---|
| ERR04-J | low | probable | medium | P4 | L3 | 
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
| \[[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]\] [§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-705|http://cwe.mitre.org/data/definitions/705.html] "Incorrect Control Flow Scoping" and [CWE-584|http://cwe.mitre.org/data/definitions/584.html] "Return Inside Finally Block" | 
      06. Exceptional Behavior (ERR)