Versions Compared

Key

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

...

This compliant solution uses a try-with-resources statement which will guarantee that both br and to manage both br and bw.  It will preserve any exceptions thrown during the processing of the input while still guaranteeing that both br and bw are properly closed, regardless of any exceptions potentially thrown during the close operationswhat exceptions occur. Finally, this code demonstrates how to access every exception that may be produced from the try-with-resources block.

Code Block
bgColor#ccccff
public void processFile(String inPath, String outPath) throws IOException{
  try (BufferedReader br = new BufferedReader(new FileReader(inPath));
       BufferedWriter bw = new BufferedWriter(new FileWriter(outPath));) {
    // process the input and produce the output
  }
}

Noncompliant Code Example

This noncompliant code example uses an ordinary try-finally block to try to close a resource.  However, if there is an exception thrown during the processing of the input and another exception thrown when closing the Bufferedreader br, then the exception thrown as a result of processing the input will be lost, and important information about that exceptional circumstance may be missed.

Code Block
bgColor#FFcccc
public void processFile(String inPath) throws IOException{
  BufferedReader br = null;
  try {
    br = new BufferedReader(new FileReader(inPath));
    // process the input and produce the output
    } finally {
      if (br != null) {
        br.close();
      }
    }
  }
}

Compliant Solution (try-with-resources)

This compliant solution uses a try-with-resources statement which will not suppress any exceptions thrown during the processing of the input while still guaranteeing that br is closed. It demonstrates how to access every exception that may be produced from the try-with-resources block.

Code Block
bgColor#ccccff
public void processFile(String inPath) throws IOException{
  try (BufferedReader br = new BufferedReader(new FileReader(inPath));) {
    // process the input and produce the output
  } catch (IOException ex) {
    System.err.println("thrown exception: " + ex.toString());
    Throwable[] suppressed = ex.getSuppressed();
    for (int i = 0; i < suppressed.length; i++) {
      System.err.println("suppressed exception: " + suppressed[i].toString());
    }
  }
}

If only one exception is thrown, either during opening, processing, or closing of the filefiles, it the exception will be printed by the "thrown exception: " statement. If an exception is thrown during processing, and another one is thrown while trying to close the either file, then the "thrown exception: " statement will print the exception encountered while closing the file, and the "suppressed exception: " statement will print the exception encountered during processing.

...