Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

346
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda