Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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
bgColor#FFCCCC
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
bgColor#ccccff
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"

...