2010-02-22 6 views

Respuesta

41

Sí, el language spec define que "2" es el resultado. Si una VM lo hace de manera diferente, no es compatible con las especificaciones.

La mayoría de los compiladores se quejan de ello. Eclipse, por ejemplo, afirmará que el bloque de retorno nunca se ejecutará, pero está mal.

Es sorprendentemente mala práctica de escribir el código de esa manera, no siempre lo hacen :)

+2

que se abstuvieron de que el minuto se me había ocurrido, pero todavía tenía curiosidad :) –

13

El fin siempre se ejecutará el bloque excepto en el siguiente ejemplo:

String test() { 
    try { 
     System.exit(0); 
    } finally { 
     return "2"; 
    } 
} 

En este caso, la JVM se detendrá, sin ejecutar el bloque finally.

Así que en tu ejemplo, el valor de retorno será 2.

+0

gusta esta respuesta – john

7

Sí, si devuelve algo del bloque finally, reemplazará cualquier cosa que haya devuelto del bloque try o catch.

Lo mismo es cierto también para excepciones. Si arroja algo en el bloque finally, esa excepción reemplazará cualquier excepción que se haya lanzado en el bloque try o catch. Así que tenga cuidado de nunca arrojar algo en el bloque finally, ya que puede ocultar el motivo original de una falla.

+1

otra cosa interesante es que si algo se devuelve desde finalmente el uso de 'return' entonces cualquier excepción lanzada se descarta. – sttaq

18

Sí, la especificación del lenguaje Java es muy clara sobre esta cuestión (14.20.2):

Una sentencia try con un bloque finally se ejecuta por primera ejecución del bloque try. A continuación, hay una opción:

  • Si la ejecución del bloque try se completa con normalidad, [...]
  • Si la ejecución del bloque try termina abruptamente debido a un lanzamiento de un valor V, [.. .]
  • Si la ejecución del bloque try termina abruptamente por cualquier otra razón R, a continuación, se ejecuta el bloque finally. A continuación, hay una opción:
    • Si el bloque finally se completa con normalidad, [...]
    • Si el bloque finally finaliza abruptamente por razones de S, entonces la instrucción try termina abruptamente por razones S (y la razón R es descartado).
0

puede vincular el siguiente enlace. Espero que proporcionará todos los detalles:

http://www.programmerinterview.com/index.php/java-questions/will-finally-run-after-return/

Dice bloque finally se ejecuta siempre incluso tratar o bloque catch tiene instrucción de retorno. Y si finalmente el bloque también tiene declaración de retorno, esto anulará la declaración de devolución que está dentro de try o catch block y en este caso cualquier excepción lanzada en try/catch será descartada (mal enfoque).

Gracias, Chethan

2

Después de leer el código de bytes del programa, el código es el siguiente:

El bloque finally declaraciones se colocarán en línea antes de la sentencia de retorno del bloque try, por lo que el regreso del fin bloque se ejecuta primero y la declaración de retorno original nunca lo hace.

Para el Programa:

String test() { 
     try { 
      System.out.println("try"); 
      return "1"; 
     } finally { 
      System.out.println("finally"); 
      return "2"; 
     } 
    } 

Convierte a:

String test() 
    { 
     System.out.println("try"); 
     String s = "1"; //temporary variable 
     System.out.println("finally"); 
     return "2"; 
     Exception exception; 
     exception; 
     System.out.println("finally"); 
     return "2"; 
    } 

Y Para el programa: con bloque catch:

String test() { 

     try { 
      System.out.println("try"); 
      return "1"; 
     } catch (RuntimeException e) { 
      System.out.println("catch"); 
      return "2"; 
     } finally { 
      System.out.println("finally"); 
      return "3"; 
     } 
    } 

se convierte en:

String test() 
    { 
     System.out.println("try"); 
     String s = "1"; 
     System.out.println("finally"); 
     return "3"; 
     RuntimeException e; 
     e; 
     System.out.println("catch"); 
     String s1 = "2"; 
     System.out.println("finally"); 
     return "3"; 
     Exception exception; 
     exception; 
     System.out.println("finally"); 
     return "3"; 
    } 

Nota: Cumplido el uso de JDK 1.7 & decompilados usando Cavaj.

+1

'throw e' nunca será alcanzable. – Viks

+0

gracias @Viks, agregué más ideas después de algunas búsquedas. –

Cuestiones relacionadas