Nueva / extraña sintaxis Java "try ()"?


Mientras jugaba con las opciones de formato personalizado en Eclipse, en una de las piezas de ejemplo de código, vi el código de la siguiente manera:

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

        }
    }
}

Nunca he visto try usado así y he estado codificando en Java durante 9 años! ¿Alguien sabe por qué harías esto? ¿Cuál es un posible caso de uso / beneficio de hacer esto?

Otro código que vi, pensé que era una abreviatura muy útil, así que lo estoy compartiendo aquí también, es bastante obvio lo que hace:

/**
 * 'multi-catch'
 */
class Example {
    void foo() {
        try {
        } catch (IllegalArgumentException | NullPointerException | ClassCastException e) {
            e.printStackTrace();
        }
    }
}
Author: Dean Rather, 2012-04-12

7 answers

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

/ editar

También podría tirar esto aquí también. Puede usar la instrucción try-with-resources para administrar Locks si usa una clase wrapper como esta:

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, dado que tiene que declarar una variable para cada recurso, la ventaja de esto es discutible.

 57
Author: Jeffrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-11 23:32:56

Esta es la nueva instrucción try-with-resources de Java 7: http://download.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html

 10
Author: Michael Schmeißer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-11 23:16:24

Esos son cambios introducidos en JDK7.

La primera instrucción es una prueba con recursos. No se exactamente por qué existen, pero las excepciones a menudo son causadas por inputstreams, etc., supongo que solo mejora la legibilidad. Edit: gracias a los otros answerers, leí el javadoc y ahora sé que cerrará todas las corrientes de e/s que implementen AutoCloseable, omitiendo la necesidad de un bloque finally en muchas situaciones

En segundo lugar es una captura múltiple, que es muy útil cuando se tiene diferentes excepciones que se manejan exactamente de la misma manera.

 6
Author: MarioDS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-11 23:16:55

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

 1
Author: kasavbere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-11 23:17:59

Que se llama con un try con resources. en un try with resources, cualquier tipo de flujo cerrable declarado en la sección resources se cerrará después de que se haga la instrucción try. Así que más o menos es un

try{
InputStream is;
//Stuff
}finally{
is.close()
}
 0
Author: Shawn Shroyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-12 00:49:50

Se añadió en java 7. Se llama try with resources. La función de instrucción Try with resources se introdujo en la versión de Java 7. La instrucción Try with resource es una instrucción try que declara una o más sentencias. Un recurso es un objeto que debe cerrarse después de que el programa haya terminado con él.

Antes de java 7 usamos finalmente block para cerrar los recursos que hemos usado en nuestro programa. En finally block tenemos que cerrar todos los recursos manualmente que hemos utilizado en nuestro programa. Para más información puede visitar probar con recursos

 0
Author: Aakash Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-11 05:06:25

El mismo uso que using(Resource) en C Sharp, lo que significa que este recurso se reciclará automáticamente cuando su programa haya salido de este bloque de código.(Solo mi opinión)

La instrucción try-with-resources asegura que cada recurso se cierre al final de la instrucción. Cualquier objeto que implemente java.lang.AutoCloseable, que incluye todos los objetos que implementan java.io.Closeable, se puede utilizar como un recurso

La Instrucción try-with-resources

 0
Author: Chopping,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 11:50:00