studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java try-catch finally

programacion - java: intenta finalmente bloquea la ejecución



manual de programacion android pdf (3)

Esta pregunta ya tiene una respuesta aquí:

Estoy confundido acerca de la ejecución try-finally cuando existe return; en el bloque try. A mi entender, el bloque finally siempre se ejecutará, es decir, antes de volver al método de llamada. Mientras se considera el siguiente código simple:

public class TryCatchTest { public static void main(String[] args){ System.out.println(test()); } static int test(){ int x = 1; try{ return x; } finally{ x = x + 1; } } }

El resultado impreso es en realidad 1. ¿Significa esto que no se ejecuta finalmente el bloque? ¿Puede alguien ayudarme con eso?


Cuando regresa del bloque try , el valor de retorno se almacena en el marco de la pila para ese método. Después de eso se ejecuta finalmente el bloque.

Cambiar el valor en el bloque finally no cambiará el valor que ya está en la pila. Sin embargo, si regresa nuevamente del bloque finally, el valor de retorno en la pila se sobrescribirá, y se devolverá la nueva x .

Si imprime el valor de x en el bloque finalmente, sabrá que se ejecuta, y el valor de x se imprimirá.

static int test(){ int x = 1; try{ return x; } finally{ x = x + 1; System.out.println(x); // Prints new value of x } }

Nota: En caso de que se devuelva un valor de referencia, el valor de referencia se almacena en la pila. En ese caso, puede cambiar el valor del objeto, utilizando esa referencia.

StringBuilder builder = new StringBuilder(""); try { builder.append("Rohit "); return builder; } finally { // Here you are changing the object pointed to by the reference builder.append("Jain"); // Return value will be `Rohit Jain` // However this will not nullify the return value. // The value returned will still be `Rohit Jain` builder = null; }

Lectura sugerida:


Se ejecuta finalmente el bloque. La variable local se incrementa. Pero el valor de esa variable local ya se ha copiado para el valor de retorno.

De la especificación del lenguaje Java, 14.17: La declaración de retorno :

Una declaración de retorno con una expresión intenta transferir el control al invocador del método que lo contiene; El valor de la expresión se convierte en el valor de la invocación del método.

...

Las descripciones anteriores dicen "intentos de transferir el control" en lugar de solo "transferencias de control" porque si hay alguna declaración de prueba (§14.20) dentro del método o constructor cuyos bloques de prueba o cláusulas catch contengan la declaración de retorno, entonces cualquier cláusula final de esas Las declaraciones de prueba se ejecutarán, en orden, de lo más interno a lo más externo, antes de transferir el control al invocador del método o constructor. La finalización brusca de una cláusula finally puede interrumpir la transferencia de control iniciada por una declaración de devolución


Usted está devolviendo x antes de salir de intentarlo. Yo haría esto:

public class TryCatchTest { public static void main(String[] args) { System.out.println(test()); } static int test() { int x = 1; try { do something with x. } finally { do something that will happen even in case of error; x = x + 1; return x; } } }