2012-04-11 29 views
40

Mientras que jugar un poco con las opciones de formato personalizados en Eclipse, en una de las piezas de la muestra de código, vi código como sigue:Nueva/extraña sintaxis "try()" de Java?

/** 
* 'try-with-resources' 
*/ 
class Example { 
    void foo() { 
     try (FileReader reader1 = new FileReader("file1"); FileReader reader2 = new FileReader("file2")) { 

     } 
    } 
} 

nunca he visto try utilizado como esto y he estado cifrando en Java durante 9 años! ¿Alguien sabe por qué harías esto? ¿Qué es un posible caso de uso/beneficio de hacer esto?

otro piezas de código vi, pensé que era un atajo muy útil, así que estoy compartiendo aquí también, que es bastante obvio lo que hace:

/** 
* 'multi-catch' 
*/ 
class Example { 
    void foo() { 
     try { 
     } catch (IllegalArgumentException | NullPointerException | ClassCastException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+4

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

+4

El beneficio de casos de uso es que los recursos que se abra en los parens try están cerrados para automáticamente sin necesitar otra captura de prueba en tu bloque final. Además, el bloque catch permite múltiples excepciones para evitar el código duplicado. –

+0

¿Has intentado con Google? –

Respuesta

51

se añadió en Java 7. Se llama la declaración try-with-resources.

/editar

ya los puedes tirar esto aquí también. Puede utilizar la sentencia try-con-recursos para gestionar Lock s si se utiliza una clase contenedora de esta manera:

public class CloseableLock implements Closeable { 
    private final Lock lock; 

    private CloseableLock(Lock l) { 
     lock = l; 
    } 

    public void close() { 
     lock.unlock(); 
    } 

    public static CloseableLock lock(Lock l) { 
     l.lock(); 
     return new CloseableLock(l); 
    } 
} 

try(CloseableLock l = CloseableLock.lock(lock)) { // acquire the lock 
    // do something 
} // release the lock 

Sin embargo, ya que se debe declarar una variable para cada recurso, la ventaja de esto es discutible.

+5

+1 por "Podría arrojar esto aquí" – WaelJ

+0

"Podría arrojar esto aquí" - ¿Qué quiere decir eso? – user3705478

6

Esos son los cambios introducidos en JDK7.

Primera afirmación es una prueba con recursos. No sé exactamente por qué existen, pero las excepciones a menudo son causadas por inputstreams, etc., supongo que solo mejora la legibilidad. Editar: gracias a los otros contestadores, leí el javadoc y ahora sé que cerrará todas las transmisiones de E/S que implementen AutoCloseable, omitiendo la necesidad de un bloque finally en muchas situaciones

La segunda es una multi- catch, que es realmente útil cuando tienes diferentes excepciones que manejas exactamente de la misma manera.

+2

Simplemente úselos: ** luego ** se aclarará el propósito de su existencia. –

1

Se llama try-with-resource. Es una manera de no tener que limpiar después de ti ya que el lenguaje lo hará por ti.

0

Eso se llama con una prueba con recursos. en una prueba con recursos, cualquier clase de flujo cerrado que se pueda declarar en la sección de recursos se cerrará después de que se haya completado la instrucción try. Así que es prácticamente un

try{ 
InputStream is; 
//Stuff 
}finally{ 
is.close() 
} 
+0

En realidad es bastante más que eso, también maneja excepciones en la llamada 'close()' de una manera definida. Si fuera * solo * esto, entonces apenas habría una razón para presentarlo. –

0

que se añadió en java 7. Se llama try with resources. Pruebe con la función de extracto de recursos que se introdujo en la versión java 7. Try with resource statement es una declaración try que declara una o más declaraciones. Un recurso es un objeto que debe cerrarse después de que el programa haya terminado.

Antes de java 7 utilizamos finally block para cerrar los recursos que hemos utilizado en nuestro programa. En el bloque finally tenemos que cerrar todos los recursos de forma manual que hemos utilizado en nuestro programa. Para obtener más información, puede visitar try with resources