2015-06-02 22 views
5

Am confusi su come funziona, infine, parola chiave in realtà ...infine non funziona come previsto

prima del blocco try corre verso il completamento torna alla ovunque il metodo è stato invocato. Ma, prima di tornare al metodo di richiamo, il codice nel blocco finally viene ancora eseguito. Quindi, ricorda che il codice nel blocco finally verrà eseguito anche se c'è un'istruzione return da qualche parte nel blocco try.

quando si esegue il codice, ottengo 5 invece di 10 come mi aspettavo

public class Main { 

    static int count = 0; 
    Long  x; 
    static Dog d  = new Dog(5); 

    public static void main(String[] args) throws Exception { 
     System.out.println(xDog(d).getId()); 
    } 

    public static Dog xDog(Dog d) { 

     try { 
      return d; 
     } catch (Exception e) { 
     } finally { 
      d = new Dog(10); 

     } 
     return d; 

    } 
} 

public class Dog { 

    private int id; 

    public Dog(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 

} 
+1

http://stackoverflow.com/questions/65035/does-finally-always-ex-security-in-java –

+0

infine il blocco viene eseguito dopo l'istruzione return, ecco perché si ottiene 5 non 10 –

risposta

9

Il blocco finally viene eseguito non prima l'istruzione return, ma prima di rendimento effettivo. Ciò significa che l'espressione nell'istruzione return viene valutata prima dell'esecuzione del blocco finally. Nel tuo caso quando scrivi return d l'espressione d viene valutata e memorizzata nel registro, quindi viene eseguito finally e viene restituito il valore da tale registro. Non c'è modo di alterare il contenuto di quel registro.

+2

Se la classe 'Dog' ha avuto un setter, e avrebbe eseguito 'd.setId (10);' in 'finally', avrebbe cambiato il valore del Cane – Loki

0

Il codice funziona correttamente e l'istruzione viene eseguita nel blocco finally. L'unica ragione per cui non ottieni 10 è perché non si restituisce il valore impostato per il blocco finale. Il codice esterno finally block non viene eseguito poiché lo restituisce già nel blocco try. Per far funzionare il tuo codice devi semplicemente cambiare il tuo metodo xDog con questo.

public static Dog xDog(Dog d) 
{ 
    try 
    { 
     return d; 
    } 
    catch (Exception e) 
    { } 
    finally 
    { 
     d = new Dog(10); 
     return d; 
    } 
} 

Spero che questo ti ha aiutato.

Problemi correlati