Whenever I need to acquire a resource in Java and then guarantee that the resource is released, where an exception might be thrown, I use the following pattern:
try { Resource resource = null; try { resource = new Resource(); // Use resource } finally { if (resource != null) { // release resource } } } catch (Exception ex) { // handle exceptions thrown by the resource usage or closing } For example, if I need a database connection, and using or closing the connection can throw an exception, I write the following code:
try { Connection connection = null; try { connection = ... // Get database connection // Use connection -- may throw exceptions } finally { if (connection != null) { connection.close(); // This can also throw an exception } } } catch (SQLException ex) { // handle exceptions thrown by the connection usage or closing } I don't like just doing a simple try-catch-finally because I am obligated to catch the (possible) exception that can be thrown when the database connection is closed, and I am never sure how to handle that one.
Is there a better pattern for handling this situation?