Considere la siguiente situación:
try (ResultSet resultSet = DriverManager.getConnection("jdbc:...", "user", "pass") .createStatement().executeQuery(sql)) { . . . } Esta es una situación en la que se han creado tres recursos dentro de los recursos de try : una Connection , una Statement y un ResultSet de resultados.
¿Qué sucederá con estos tres recursos después de que finalice el bloque de prueba? ¿Se cerrarán todos, incluso si no tienen ninguna referencia a ellos, o solo se cerrará el resultSet de resultados?
¿Es seguro declarar recursos AutoCloseable sin ninguna referencia a ellos al intentar con bloques de recursos?
Solo se cerrará el ResultSet . Si desea que se cierren varios recursos, debe declararlos por separado:
try (Connection conn = DriverManager.getConnection("jdbc:...", "user", "pass"); Statement stmt = conn.createStatement(); ResultSet resultSet = stmt.executeQuery(sql)) { // do stuff... }¿Es seguro declarar recursos autocerrables sin ninguna referencia a ellos al intentar con bloques de recursos?
Si y no. Este código no cerrará automáticamente los recursos que no se asignaron a las variables de recursos. Por lo tanto:
ResultSet dentro del bloque de try .Como interpreto que "seguro" significa ambas cosas, mi respuesta considerada es "No", no es seguro.
Los únicos recursos que se cerrarán automáticamente mediante la prueba con recursos son los que están asignados a las variables de recursos. Así que la forma correcta de escribir eso sería:
try (Connection connection = DriverManager.getConnection(...); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) { // ... }Tenga en cuenta que las variables de recursos se cierran automáticamente en el orden inverso al que se declaran.
Tenga en cuenta que a menudo puede salirse con la suya. Por ejemplo:
try (BufferedWriter bw = new BufferedWriter(new FileWriter(...)) { // ... } es probable que esté bien, excepto en circunstancias extremadamente inusuales. Cuando bw se cierra automáticamente, su método close( close() llama a close() en FileWriter . El único caso en el que esto podría filtrar un recurso es cuando falla la creación/construcción de BufferedWriter . Creo que eso solo es posible si tienes la mala suerte de obtener un OOME en ese momento. (Y OOME bien puede desencadenar una recolección de basura completa que encontrará y cerrará el recurso descartado de todos modos...)
También puede hacerlo con varios recursos:
try (Connection c = DriverManager.getConnection("jdbc:...", "user", "pass"); Statement s = c.createStatement(); ResultSet resultSet = s.executeQuery(sql)) { //... } Todas las variables que implementan la interfaz AutoClosable se cierran después de la ejecución del bloque de try .