java - excepciones - ¿Podemos usar "retorno" en el bloque finalmente
try finally java (4)
Puede escribir la declaración de return
en el bloque finally
, pero el valor devuelto desde el bloque de try
se actualizará en la pila y no el valor de retorno del bloque final.
Digamos que tiene esta función
private Integer getnumber(){
Integer i = null;
try{
i = new Integer(5);
return i;
}catch(Exception e){return 0;}
finally{
i = new Integer(7);
System.out.println(i);
}
}
y estas llamando desde el método principal
public static void main(String[] args){
System.out.println(getNumber());
}
Esto imprime
7
5
Esta pregunta ya tiene una respuesta aquí:
- Volviendo de un bloque finalmente en Java 5 respuestas
- Retornos múltiples: ¿Cuál establece el valor de retorno final? 6 respuestas
¿Podemos usar la declaración de retorno en el bloque finalmente ? ¿Puede esto causar algún problema?
Sí, puede escribir la declaración de retorno en un bloque final y anulará el otro valor de retorno.
EDITAR:
Por ejemplo en el siguiente código
public class Test {
public static int test(int i) {
try {
if (i == 0)
throw new Exception();
return 0;
} catch (Exception e) {
return 1;
} finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(test(0));
System.out.println(test(1));
}
}
La salida es siempre 2, ya que estamos devolviendo 2 del bloque finally. Recuerde que el último siempre se ejecuta si hay una excepción o no. Entonces, cuando el bloque finalmente se ejecute, anulará el valor de retorno de otros. No es necesario escribir declaraciones de devolución en el bloque finalmente, de hecho, no debe escribirlas.
Sí, puedes, pero no debes 1, porque el bloque finalmente está destinado a un propósito especial.
Finalmente, es útil para algo más que el manejo de excepciones: le permite al programador evitar que el código de limpieza se pase por alto accidentalmente por una devolución, continuar o romper. Poner el código de limpieza en un bloque final es siempre una buena práctica, incluso cuando no se prevén excepciones.
No se recomienda escribir su lógica en su interior.
Si regresa desde el interior de un bloque final, se perderán las exceptions
.
Una declaración de retorno dentro de un bloque finally provocará que se descarte cualquier excepción que se pueda lanzar en el bloque try o catch.
Según la especificación del lenguaje Java:
Si la ejecución del bloque try se completa abruptamente por cualquier otra razón R, entonces se ejecuta el bloque finally, y entonces hay una opción:
If the finally block completes normally, then the try statement completes abruptly for reason R. If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).
Nota: De acuerdo con JLS 14.17 , una declaración de retorno siempre se completa de manera abrupta.