2014-10-14 18 views
12

Perché scrivere Prova senza cattura o infine come nell'esempio seguente?Perché scrivere Prova senza cattura o infine?

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

} 
+6

leggere su provare con le risorse (Java 7) – Eran

+7

Sede [Prova con risorse] (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) – Justin

+0

Duplicazione di "Ha senso fare" try-finally "senza" catch "?" – Juru

risposta

17

Come spiegato in precedenza questa è una caratteristica in Java 7 e oltre. try with resources consente di saltare la scrittura dello finally e chiude tutte le risorse utilizzate nello stesso try-block. Come indicato in Docs

Qualsiasi oggetto che implementa java.lang.AutoCloseable, che include tutti gli oggetti che implementano java.io.Closeable, può essere utilizzato come una risorsa.

Vedi questo codice di esempio

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

In questo esempio la risorsa è BufferReader oggetto come la classe implementa l'interfaccia java.lang.AutoCloseable e sarà chiuso se il blocco try viene eseguito correttamente o meno il che significa che hai vinto Non è necessario scrivere br.close() in modo esplicito.

Un'altra cosa importante da notare qui è che se si sta scrivendo il finally bloccare te stesso e sia la vostra eccezione tiro try e finally blocco poi l'eccezione da try blocco viene soppressa.

Mentre d'altra parte se si utilizza try-with-resources dichiarazione e viene generata un'eccezione sia try blocco e try-with-resources dichiarazione poi in questo caso l'eccezione da try-with-resources dichiarazione è soppressa.

Come @Aaron ha già risposto sopra ho appena cercato di spiegarti. Spero che sia d'aiuto.

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

+1

Quindi è analogo a C# che usa & IDisposable 's. – roufamatic

7

Questa è una nuova funzionalità in Java 7 e oltre. Senza questo, avresti bisogno di un blocco finally che chiuda la risorsa PrintWriter out. Quindi il codice di cui sopra è equivalente a:

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

Vedi The try-with-resources Statement

+0

Non sono equivalenti. Se l'eccezione viene generata da entrambi i blocchi try e finally, l'eccezione dal blocco try verrà eliminata con try-and-catch. D'altra parte, se si utilizza l'istruzione try-with-resources, l'eccezione dal blocco finally (eccezione di chiusura automatica) verrà eliminata. – Nier

+0

@Nier Risolto il problema alla fine. –