2013-08-10 11 views
5

ho provato il seguente frammento di codice:Tipo di ritorno con il try-catch-finally

private Integer getnumber() { 
    Integer i = null; 
    try { 
     i = new Integer(5); 
     return i; 
    } catch(Exception e) { 
     return 0; 
    } finally { 
     i = new Integer(7); 
    } 
} 

Questo metodo restituisce 5 e non 7.

Perché restituisce 5 e non 7?

Grazie in anticipo.

+3

molto breve risposta "valore di i è già aggiornato nello stack quando si dice di ritorno i" in modo che non viene aggiornato quando si aggiorna in seguito – Algorithmist

+0

@Algorithmist questo è corretto, il valore di ritorno è già in stack e modificando il valore in seguito non lo influenzerà. Sposta a una risposta. –

+0

@ user2669894, la tua domanda ha una spiegazione ben dettagliata qui, http://stackoverflow.com/questions/8864230/javas-return-value-in-try-catch-finally-mechanism, cortesemente controlla. –

risposta

3

Questo accade perché la finally blocco di un try..catch..finally corre dopo il codice all'interno del try..catch ha completato (sia esso con successo o meno); nel caso del tuo codice questo è quando si è verificato il return i.

A causa di questo comportamento, il valore di i è già stato inserito nella variabile di ritorno del metodo prima di assegnarvi il nuovo valore di 7. Di seguito avrebbe funzionato:

private Integer getnumber(){ 
    Integer i = null; 
    try { 
    i = new Integer(5); 
    } 
    catch(Exception e){ 
    i = new Integer(0); 
    } 
    finally{ 
    i = new Integer(7); 
    } 
    return i; 
} 
0

ti viene assegnato il valore in finally e prima che si restituiti nel try

Il codice nella infine esegue sempre, ma si stanno già restituito il valore in try

0

Questo perché l'istruzione return viene eseguito prima il finally viene eseguito e il valore di i è 5 quando viene eseguita la dichiarazione di ritorno. Per verificare questo, si può fare questo

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); 
} 
} 

Questo stampa 7, perché il blocco finally non esegue, ma semplicemente dopo l'istruzione return.

+2

Questo è sbagliato, alla fine verrà chiamato anche se c'è un ritorno in prova. –

+0

Quello che voglio dire è il valore dei viene restituito e quindi viene eseguito blocco finally –

+0

È possibile verificare che il valore stampato è 7 che è dal blocco finally, ma il valore effettivo restituito è 5 –

0

In finally si sta assegnando il valore, ma il valore viene restituito prima nella try blocco

0

valore restituito è 5 perché return sta accadendo prima finally esegue blocco.

Problemi correlati