...
This noncompliant code example uses an ordinary try-finally block to try to close two resources. However, if closing the Bufferedreader
br
results in an exception being thrown, then the BufferedWriter
bw
will not be closed.
Code Block | ||
---|---|---|
| ||
public void err54_nce1(String inPath = ...; // input file path , String outPath) = ...; // output file path throws IOException{ BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new FileReader(inPath)); bw = new BufferedWriter(new FileWriter(outPath)); // process the input and produce the output } finally { if (br != null) { br.close(); } if (bw != null) { bw.close(); } } } |
Compliant Solution
This compliant solution uses a try-with-resources statement which will guarantee that both br
and bw
are closed, regardless of any exceptions potentially thrown during the close operations.
Code Block | ||
---|---|---|
| ||
public void err54_cs1(String inPath = ...; // input file path , String outPath) = ...; // output file path 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 | ||
---|---|---|
| ||
public void err54_nce2(String inPath) = ...; // input file path 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
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.
Code Block | ||
---|---|---|
| ||
public void err54_cs2(String inPath) = ...; // input file path 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 file, it 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 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.
...