¿Por qué escribir Try-With-Resources sin Catch o Finalmente?

3 minutos de lectura

Avatar de usuario de Umair Hashmi
Umair Hashmi

¿Por qué escribir Probar sin captura o Finalmente como en el siguiente ejemplo?

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet tryse</title>");            
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet tryse at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }

}

  • lea acerca de probar con recursos (Java 7)

    – Eran

    14 de octubre de 2014 a las 9:08

  • Ver Prueba con recursos

    – Justin

    14 de octubre de 2014 a las 9:10

  • Duplicado de “¿Tiene sentido hacer “intentar-finalmente” sin “atrapar”?”

    – Juru

    14 de octubre de 2014 a las 9:12


  • @Juru: Esto de ninguna manera es un duplicado de eso…

    –Oliver Charlesworth

    14 de octubre de 2014 a las 9:13

  • Habiendo dicho eso, no creo que esta sea la primera pregunta sobre probar con recursos. Sin embargo, ¡+1 simplemente porque nunca antes había oído hablar de esta función!

    –Oliver Charlesworth

    14 de octubre de 2014 a las 9:13

Avatar de usuario de Syed Ali Taqi
Syed Ali Taqi

Como se explicó anteriormente, esta es una característica de Java 7 y versiones posteriores. try with resources permite saltarse la escritura del finally y cierra todos los recursos que se utilizan en try-block sí mismo. Como se indica en Documentos

Cualquier objeto que implemente java.lang.AutoCloseable, que incluye todos los objetos que implementen java.io.Closeable, se puede utilizar como recurso.

Ver este ejemplo de código

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

En este ejemplo el recurso es BufferReader objeto como la clase implementa la interfaz java.lang.AutoCloseable y se cerrará si el bloque de prueba se ejecuta con éxito o no, lo que significa que no tendrá que escribir br.close() explícitamente.

Otra cosa importante a tener en cuenta aquí es que si estás escribiendo el finally bloquearte a ti mismo y a tus dos try y finally bloquear lanzar excepción entonces la excepción de try se suprime el bloqueo.

Mientras que, por otro lado, si está utilizando try-with-resources la declaración y la excepción son lanzadas por ambos try bloquear y try-with-resources declaración entonces en este caso la excepción de try-with-resources se suprime la declaración.

Como @Aaron ya respondió anteriormente, solo traté de explicarte. Espero eso ayude.

Fuente: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

  • Por lo tanto, es análogo al uso de C# & IDisposable.

    – rufamático

    25/10/2016 a las 17:26

  • @roufamatic sí, análogo, aunque la gran diferencia es que C# using no protege de ninguna manera contra las excepciones, solo garantiza el cierre del recurso al final del bloque. En C#, la mayoría de las veces tiene que combinar using bloques con try bloques de Java try-with-resources hace esto juntos.

    –Michael Plautz

    27 de abril de 2018 a las 4:26

Avatar de usuario de Aaron Digulla
Aarón Digulla

Esta es una característica nueva en Java 7 y posteriores. Sin esto, necesitarías un finally bloque que cierra el recurso PrintWriter out. Así que el código anterior es equivalente a:

PrintWriter out = null;
try {
    PrintWriter out = ...
} finally {
    if(null != out) {
        try {
            out.close();
        } catch(Exception e) {} // silently ignore!
    }
}

Ver La declaración de prueba con los recursos

  • No son equivalentes. Si la excepción se produce tanto en el bloque try como en el bloque finalmente, la excepción del bloque try se suprimirá con try-and-catch. Por otro lado, si usa la declaración de prueba con recursos, se suprimirá la excepción del bloque finalmente (cierre automático lanza excepción).

    – Nier

    21 de diciembre de 2017 a las 9:30

  • @Nier Arregló la parte final.

    – Aarón Digulla

    30 de diciembre de 2017 a las 10:27

¿Ha sido útil esta solución?