Versions Compared

Key

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

...

In this noncompliant code example, the finally block completes abruptly because of a return statement in the block.

Code Block
bgColor#FFCCCC

class TryFinally {
  private static boolean doLogic() {
    try {
      throw new IllegalStateException();
    } finally {
      System.out.println("logic done");
      return true;
    }
  }
}

...

This compliant solution removes the return statement from the finally block.

Code Block
bgColor#ccccff

class TryFinally {
  private static boolean doLogic() {
    try {
      throw new IllegalStateException();
    } finally {
      System.out.println("logic done");
    }
    // Any return statements must go here; 
    // applicable only when exception is thrown conditionally
  }
}

...

For example, the following code does not violate this rule, because the break statement exits the while loop, but not the finally block.

Code Block
bgColor#ccccff

class TryFinally {
  private static boolean doLogic() {
    try {
      throw new IllegalStateException();
    } finally {
      int c;
      try {
        while ((c = input.read()) != -1) {
          if (c > 128) {
            break;
          }
        }
      } catch (IOException x) {
        // forward to handler
      }
      System.out.println("logic done");
    }
    // Any return statements must go here; applicable only when exception is thrown conditionally
  }
}

...

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

ERR04-J

low

probable

medium

P4

L3

Automated Detection

Tool
Version
Checker
Description
Coverity7.5PW.ABNORMAL_TERMINATION_ OF_FINALLY_BLOCKImplemented

Related Guidelines

MITRE CWE

CWE-459. Incomplete cleanup

 

CWE-584. Return inside finally block

...

[Bloch 2005]

Puzzle 36. Indecision

[Chess 2007]

8.2, Managing Exceptions, The Vanishing Exception

[JLS 2005]

§14.20.2, Execution of try-catch-finally

 

      06. Exceptional Behavior (ERR)