At first the need for a finally
statement may not be immediately apparent. Programmers often ask "Is the finally
statement really necessary or is it just sugar for my Java?" In particular, C++ programmers doubt the need for a finally
statement because C++ doesn't have one.The need for a finally
statement is not apparent until you consider the following: how does the PrintWriter
in the writeList
method get closed if you don't provide an exception handler for the ArrayIndexOutOfBoundsException
and anArrayIndexOutOfBoundsException
occurs? (It's easy and legal to omit an exception handler for ArrayIndexOutOfBoundsException
because it's a runtime exception and the compiler won't alert you that the writeList
contains a method call that might throw one.) The answer is that the PrintWriter
does not get closed if an ArrayIndexOutOfBoundsException
occurs and writeList
does not provide a handler for it--unless the writeList
provides a finally
statement.
There are other benefits to using the finally
statement. In the writeList
example it is possible to provide for cleanup without the intervention of a finally
statement. For example, you could put the code to close the PrintWriter
at the end of the try
block and again within the exception handler for ArrayIndexOutOfBoundsException
, as shown here:
try {
. . .
out.close(); // don't do this; it duplicates code
} catch (ArrayIndexOutOfBoundsException e) {
out.close(); // don't do this; it duplicates code
System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
try
block that may throw a new type of exception, you will have to remember to close thePrintWriter
within the new exception handler (which if you're anything like me, you are bound to forget).
No comments:
Post a Comment