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

java - programacion - Comportamiento de declaración de devolución en captura y finalmente



manual de programacion android pdf (6)

Por favor vea el siguiente código y explique el comportamiento de salida.

public class MyFinalTest { public int doMethod(){ try{ throw new Exception(); } catch(Exception ex){ return 5; } finally{ return 10; } } public static void main(String[] args) { MyFinalTest testEx = new MyFinalTest(); int rVal = testEx.doMethod(); System.out.println("The return Val : "+rVal); } }

El resultado es el retorno Val: 10.

Eclipse muestra una advertencia: finally block does not complete normally .

¿Qué sucede con la declaración de devolución en el bloque catch?


El bloque finally siempre se ejecuta (si se ejecutó la prueba de coincidencia), por lo que antes de que el método devuelva 5 como en el bloque catch , ejecuta el bloque finally y devuelve 10.


Es anulado por el que está finally , porque finally se ejecuta después de todo lo demás.

Por eso, una regla general: nunca regrese del finally . Eclipse, por ejemplo, muestra advertencias para ese fragmento: "finalmente el bloqueo no se completa normalmente"


Esta es una pregunta fácil si recuerda el diseño de bajo nivel de la máquina virtual.

  1. El valor de retorno se sube a la pila por el código de captura.
  2. Después, el código finalmente se ejecuta y sobrescribe el valor en la pila.
  3. Luego, el método regresa con el valor más actualizado (10) para ser utilizado por la persona que llama.

Si no está seguro de cosas como esta, vuelva a su comprensión del sistema subyacente (en última instancia, vaya al nivel de ensamblador).

( nota al margen )


la sección final se ejecutará siempre se ejecutará. por ejemplo, si tiene algo que liberar, o cerrar la sesión, si se produce un error, vaya a la sección de captura y finalmente se ejecutará.

Session session // opened some session try { // some error } catch { log.error } finally { session.logout();}

no debería usarse para devolver nada. puedes usar fuera de.


Finalmente el bloque siempre se ejecuta a menos y hasta que la instrucción System.exit () sea la primera en el bloque finally.

Entonces, aquí en el ejemplo anterior, la declaración try arroja la ejecución y obtiene catch en catch block. Hay declaración de devolución con el valor 5, entonces en la pila se agrega el valor 5 más tarde finalmente se ejecuta el bloque y se agrega el último valor de retorno en la parte superior de la pila mientras se devuelve el valor, la pila devuelve el último valor según el comportamiento de la pila "ÚLTIMO EN PRIMERA SALIDA" Devolverá el valor como 10.


finally se ejecuta siempre (la única excepción es System.exit() ). Puedes pensar en este comportamiento de esta manera:

  1. Se arroja una excepción
  2. Se captura la excepción y el valor de retorno se establece en 5
  3. Finalmente se ejecuta el bloque y el valor de retorno se establece en 10
  4. La función regresa