¿Qué es try with resources en Java y cómo usarlo?

Contenido del Bootcamp Dirigido por: | Última modificación: 10 de octubre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Una de las tareas más complejas al trabajar con Java era enfrentarse al manejo de recursos como conexiones de bases de datos, archivos o streams, porque luego de usarlos era necesario cerrarlos, de modo que los desarrolladores tenían que escribir bastante código repetitivo y gestionar manualmente cada cierre. Ahora, con try with resources en Java, se logró simplificar bastante esta tarea y aquí te contaré cómo puedes usarlo.

try with resources en java

¿Qué es try with resources?

Try with resources es una funcionalidad que llegó con Java 7 para facilitarte la vida cuando trabajes con recursos como archivos o conexiones. La idea es que, en lugar de tener que cerrar manualmente cada recurso en un bloque finally, Java lo hace por ti de manera automática, siempre que esos recursos implementen la interfaz AutoCloseable.

Su propósito es que tu código sea más sencillo de escribir y entender, además de reducir la posibilidad de errores. Te servirá en aquellas situaciones donde olvidarte de cerrar un recurso podría causar problemas graves, como fugas de memoria.

¿Cómo funciona try with resources?

El bloque try-with-resources funciona con cualquier clase que implemente la interfaz AutoCloseable, lo que incluye muchas clases de Java como las que implementan la interfaz Closeable.

Básicamente, si una clase tiene el método close(), que es el encargado de cerrar el recurso, Java se asegura de llamar automáticamente a este método cuando el bloque try termina, sin importar si todo salió bien o si hubo una excepción. Así te ahorras tener que cerrar manualmente los recursos.

Ejemplo de código antes de try with resources

De esta forma se manejaban los recursos antes de de try with resources en Java. Por ejemplo, al trabajar con JDBC para manejar una conexión a una base de datos, el código era así:

Connection connection = null;
PreparedStatement pStatement = null;
ResultSet resultSet = null;

try {
connection = getConnection();
pStatement = connection.prepareStatement(sql);
resultSet = pStatement.executeQuery();

while (resultSet.next()) {
// Gestionar ResultSet
}
} catch (SQLException e) {
throw new RuntimeException("Error al ejecutar la consulta.", e);
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// Manejo de error al cerrar ResultSet
}
}
if (pStatement != null) {
try {
pStatement.close();
} catch (SQLException e) {
// Manejo de error al cerrar PreparedStatement
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// Manejo de error al cerrar la conexión
}
}
}

Como ves, es un código engorroso porque debes gestionar manualmente el cierre de cada recurso, y si te olvidas de cerrar alguno, podrías tener problemas de rendimiento o fugas de recursos.

Cuando usas el bloque try with resources

Lo bueno del bloque try-with-resources, es que puedes declarar los recursos dentro de los paréntesis del try, y Java se encarga de cerrarlos automáticamente cuando termina el bloque.

Este es el mismo ejemplo, pero con try with resources:

try (Connection connection = getConnection();
PreparedStatement pStatement = connection.prepareStatement(sql);
ResultSet resultSet = pStatement.executeQuery()) {

while (resultSet.next()) {
// Gestionar ResultSet
}
} catch (SQLException e) {
throw new RuntimeException("Error al ejecutar la consulta.", e);
}

Ahora tienes un código mucho más limpio y fácil de seguir. Ya no necesitas preocuparte por cerrar manualmente los recursos, porque ahora será tarea de Java.

¿Cómo crear una clase compatible con try with resources?

Si estás trabajando en un proyecto donde necesitas crear tu propio recurso que deba ser cerrado, puedes hacer que esa clase sea compatible con try with resources implementando la interfaz AutoCloseable. Así te quedaría:

public class MiRecurso implements AutoCloseable {

public void usarRecurso() {
System.out.println("Usando recurso...");
}

@Override
public void close() {
System.out.println("Cerrando recurso...");
}
}

Y puedes usar esta clase de la siguiente manera:

try (MiRecurso recurso = new MiRecurso()) {
recurso.usarRecurso();
} catch (Exception e) {
e.printStackTrace();
}

Cuando lo ejecutes, verás que el método close() se llama automáticamente al finalizar el bloque try, y tú no tuviste que intervenir para nada.

Ejemplos prácticos de try with resources

Lectura de archivos con FileReader

try (FileReader fileReader = new FileReader("archivo.txt")) {
int data;
while ((data = fileReader.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}

Aquí usamos un FileReader para leer el contenido de un archivo, y gracias a try with resources, no necesitamos cerrar el archivo manualmente.

Uso con conexiones JDBC

try (Connection conn = DriverManager.getConnection(dbUrl);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM empleados")) {

while (rs.next()) {
System.out.println("Empleado: " + rs.getString("nombre"));
}
} catch (SQLException e) {
e.printStackTrace();
}

En este ejemplo, el bloque try-with-resources cierra automáticamente la conexión a la base de datos, el Statement y el ResultSet, evitando posibles fugas de recursos.

La programación en Java es realmente apasionante y si quieres aprender todo sobre estas y muchas otras funcionalidades que cambiarán tu forma de programar, el Bootcamp de Java Full Stack de KeepCoding es para ti. No solo aprenderás a dominar try with resources y otros conceptos clave, sino que además adquirirás las habilidades necesarias para convertirte en un desarrollador Java completo, listo para afrontar los desafíos del sector tecnológico. ¡Da el salto y transforma tu carrera!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado