Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

341
Vistas
Usar "probar con recursos" para recursos creados sin ninguna referencia

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?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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... }
over 4 years ago · Santiago Trujillo Denunciar

0

¿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:

  • "Sí", esos recursos seguirán siendo "seguros" para usar a través de operaciones en el ResultSet dentro del bloque de try .
  • "No", esos recursos se filtrarán, y eso puede causar problemas más adelante.

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...)

over 4 years ago · Santiago Trujillo Denunciar

0

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 .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda