Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

340
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!