web-dev-qa-db-fra.com

Pourquoi écrire Try-With-Resources sans Catch ou Enfin?

Pourquoi écrire Try without a Catch ou Enfin comme dans l'exemple suivant?

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>");
    }

}
30
Umair Hashmi

Comme expliqué ci-dessus, il s'agit d'une fonctionnalité de Java 7 et au-delà. try with resources Permet d'ignorer l'écriture de finally et ferme toutes les ressources utilisées dans try-block Lui-même. Comme indiqué dans Docs

Tout objet qui implémente Java.lang.AutoCloseable, qui inclut tous les objets qui implémentent Java.io.Closeable, peut être utilisé comme ressource.

Voir cet exemple de code

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

Dans cet exemple, la ressource est BufferReader objet car la classe implémente l'interface Java.lang.AutoCloseable Et elle sera fermée que le bloc try s'exécute avec succès ou non, ce qui signifie que vous n'aurez pas à écrire br.close() explicitement.

Une autre chose importante à noter ici est que si vous écrivez vous-même le bloc finally et vos try et finally exception de levée de bloc, puis l'exception du bloc try est supprimée.

En revanche, si vous utilisez l'instruction try-with-resources Et que l'exception est levée à la fois par le bloc try et par l'instruction try-with-resources, Dans ce cas, l'exception de try-with-resources est supprimée.

Comme le @Aaron a déjà répondu ci-dessus, j'ai juste essayé de vous expliquer. J'espère que ça aide.

Source: http://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

40
Syed Ali Taqi

Il s'agit d'une nouvelle fonctionnalité de Java 7 et au-delà. Sans cela, vous auriez besoin d'un bloc finally qui ferme la ressource PrintWriter out. Le code ci-dessus est donc équivalent à:

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

Voir L'instruction try-with-resources

10
Aaron Digulla