Esta pregunta me fastidia por un tiempo pero aún no encontré una respuesta completa (por ejemplo, esta es para C# Initializing disposable resources outside or inside try/finally). Considere dos siguientes fragmentos de código Java:Java try finally variations
Closeable in = new FileInputStream("data.txt");
try {
doSomething(in);
} finally {
in.close();
}
y la segunda variación
Closeable in = null;
try {
in = new FileInputStream("data.txt");
doSomething(in);
} finally {
if (null != in) in.close();
}
La parte que me preocupa es que el hilo podría ser interrumpido algo entre el recurso momento en que se adquiere (por ejemplo archivo se abre) pero el valor resultante no está asignado a la variable local respectiva. ¿Hay alguna otra escenarios del hilo podría ser interrumpido en el punto anterior que no sea:
- InterruptedException (por ejemplo a través del hilo # interrupción()) o OutOfMemoryError excepción es lanzada
- salidas de JVM (por ejemplo, a través de matar, Sistema. exit())
- hardware falla (o error en la JVM para la lista completa :)
he leído que el segundo enfoque es algo más "idiomática", pero la OMI en el escenario anterior no hay diferencia y en todos los demás escenarios son iguales.
Entonces la pregunta:
¿Cuáles son las diferencias entre los dos? ¿Qué debería preferir si me preocupo por la liberación de recursos (especialmente en aplicaciones con varios subprocesos)? ¿Por qué?
Agradecería que alguien me señale las partes de las especificaciones de Java/JVM que respaldan las respuestas.
siempre que haya adquirido el recurso en el bloque try ... – pgras
Desafortunadamente, "administrado" significa que resuelve solo una parte de los problemas de administración de recursos (aunque es considerable). Si adquiere muchos recursos, debe tener cuidado de liberarlos, ya que generalmente hay una cantidad limitada de ellos. Y sí, hay bloqueos. Y bloqueos. –
@pgras ¿Por qué querrías adquirir los recursos en el bloque 'try'? Eso solo arruina tu código. –