Try-with-resources equivalente en Java 1.6

Tengo el siguiente código:

public class Main { public static void main(String[] args) throws SQLException { try ( Connection conn = DBUtil.getConnection(DBType.HSQLDB); Statement stmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery("SELECT * FROM tours"); ) { DBUtil.getConnection(); } catch (SQLException e) { DBUtil.processException(e); } } } 

Uso este código para obtener datos de una base de datos. Mi problema es que no tengo permitido usar el comstackdor Java 1.7 y tengo que usar 1.6. ¿Cómo puedo traducir el código try-with-resources para usar con un comstackdor 1.6? ¿Qué sucede exactamente en este bloque de prueba especial?

Oracle explica cómo funciona try-with-resources aquí

El TL; DR de esto es:
No hay una forma simple de hacer esto en Java 1.6. El problema es la ausencia del campo Suprimido en Excepción. Puede ignorar eso y codificar lo que sucede cuando ambos intentan Y cierran lanzan diferentes excepciones, o crean su propia subjerarquía de Excepción que tiene el campo suprimido.

En el segundo caso, el enlace de arriba proporciona la forma correcta de hacerlo:

  AutoClose autoClose = new AutoClose(); MyException myException = null; try { autoClose.work(); } catch (MyException e) { myException = e; throw e; } finally { if (myException != null) { try { autoClose.close(); } catch (Throwable t) { myException.addSuppressed(t); } } else { autoClose.close(); } } 

es equivalente a

 try (AutoClose autoClose = new AutoClose()) { autoClose.work(); } 

En caso de que quiera hacerlo más fácil y no crear una gran cantidad de nuevas clases de Excepción, tendrá que decidir qué arrojar en la cláusula de captura dentro de la finalmente (t o e).

PD. El tratamiento de la statement de variables múltiples en el bash también se analiza en el enlace anterior. Y la cantidad de código que necesita para hacerlo correctamente es asombroso. La mayoría de las personas toman accesos directos en Java 1.6 al no hacer frente a las excepciones en el bloque finally y al usar nullchecks.

Hazlo asi:

 Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DBUtil.getConnection(DBType.HSQLDB); stmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery("SELECT * FROM tours"); } catch (SQLException e) { DBUtil.processException(e); } finally { if(conn != null) { conn.close(); } if(stmt != null) { stmt.close(); } if(rs != null) { rs.close(); } } 

Aconsejaría el uso de la biblioteca commons-dbutils de apache que tiene clase DBUtils con métodos close y closeQuietly . El código se vería así:

 import org.apache.commons.dbutils.DBUtils; ... Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = myOwnUtil.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery( "SELECT * FROM table" ); // or any other custom query } catch ( SQLException e ) { <>; } finally { DBUtils.closeQuietly( conn ); DBUtils.closeQuietly( stmt ); DBUtils.closeQuietly( rs ); // or simply use DBUtils.close( conn, stmt, rs ); } 

Tenga en cuenta que closeQuietly no arrojará excepciones, mientras que close podría lanzar SQLException, así que adapte el código a su propio caso de uso.

Si desea cerrar transmisiones, puede usar commons-io de apache con la clase IOUtils, que también tienen close y closeQuietly.