2013-06-23 12 views
8

Qual è la differenza tra "finally" e write after "catch"?Differenza tra finally e write after catch

Ad esempio:

public boolean example() { 
    try { 
     // Code 
    } catch (RuntimeException e) { 
     // Code 
    } finally { 
     return true; 
    } 
} 

public boolean example() { 
    try { 
     // Code 
    } catch (RuntimeException e) { 
     // Code 
    } 
    return true; 
} 
+0

È possibile aggiungere la logica per chiudere le risorse nell'istruzione di blocco 'finally' e ottenere un'eccezione qui, quindi l'alternativa migliore sarebbe quest'ultima (IMO). –

+0

nessuna differenza nel tuo esempio. Fai un po 'di pulizia, infine, che verrà eseguito comunque. – Tala

risposta

2

Nessuna differenza nel tuo caso. ma

Il sistema di runtime esegue sempre le istruzioni all'interno di finally block indipendentemente da ciò che accade all'interno del blocco try.

Quindi è il posto perfetto per eseguire la pulizia.

Si noti che se si utilizza JDK 7+, la maggior parte degli usi del blocco finally può essere eliminata, semplicemente utilizzando un try-with-resources statement.

3

Nel codice fornito non c'è differenza. Ma alla fine è usato per eseguire qualche pezzo di codice dopo il blocco try, non importa se c'è un'eccezione o meno.

Il punto interessante da fare qui è che dovremmo evitare di tornare dal blocco finally perché può creare confusione nello scenario quando restituiamo qualcosa anche dal blocco try. Considerare questo codice:

try { 
    return true; 
} 
finally { 
    return false; 
} 

Ora questo codice restituirà false indipendentemente da ciò che accade nel tentativo. In molti modi questo comportamento è esattamente coerente con la comprensione colloquiale di ciò che significa finalmente - "non importa ciò che accade prima nel blocco try, eseguire sempre questo codice". Quindi se si restituisce true da un blocco finale, l'effetto complessivo deve sempre essere quello di restituire true, no?

In generale, questo è raramente un buon linguaggio, e si dovrebbe utilizzare finalmente blocchi liberamente per ripulire le risorse/chiusura, ma raramente se mai restituire un valore da loro.

+0

Se alla fine si interrompe bruscamente, restituendo o generando un'eccezione, qualsiasi ritorno precedente della chiamata di funzione viene ignorato. Ciò significa che alla fine ingerirà qualsiasi eccezione o valore di ritorno ordinario, se genera un'eccezione o se utilizza il reso. Come indicato, utilizza infine per la pulitura delle risorse e ricorda che se in un secondo momento effettui chiamate che potrebbero generare un'eccezione, dovresti includerle nel try-catch per evitare di ingoiare altre eccezioni. Se usi try-with-resources puoi ottenere l'eccezione ingoiata con Throwable.getSuppressed() –

-2

infine() viene utilizzato ogni volta che vogliamo che qualche riga di codice dovrebbe essere eseguito anche se si verifica un'eccezione Ma se u scrivere riga di codice dopo cattura non sarà eseguito se si verifica un'eccezione ..

+2

Questo è semplicemente sbagliato. Il codice viene eseguito dopo il tentativo di cattura. –

4

First di tutti, l'unico linguaggio che può anche essere considerato un candidato è questo:

try { 
    // stuff 
} catch (Throwable t) { /* handle */ } 
// finally stuff 

Annotare il tipo di pescato. Solo se rilevi un'eventuale eccezione, compresi mostri oscuri come ThreadDeath e VirtualMachineError, puoi sperare di raggiungere incondizionatamente il codice sotto il try-catch.

Ma, questo è solo dove inizia. Cosa succede se il codice di gestione stesso lancia un'eccezione? Quindi è necessario almeno

try { /* main stuff */ } 
catch (Throwable t) { 
    try { /* handle */ } catch (Throwable t) { 
    // no code allowed here! Otherwise we descend into infinite recursion 
    } 
} 
/* finally stuff */ 

Ora si può essere cominciando a realizzare i benefici di finally, ma non è tutto. Si consideri uno scenario abbastanza tipico:

try { 
    /* main stuff, may throw an exception. I want the exception to 
    break what I'm doing here and propagate to the caller */ 
    return true; 
} finally { /* clean up, even if about to propagate the exception */ } 

Come si riscrive questo? Senza duplicazione del codice, impossibile.

0

La prima cosa da capire in questa domanda è "perché usiamo try {} catch {} block" Ok.

La risposta è, quando esiste una possibilità del nostro codice di lancio di un'eccezione.

Questo tipo di codice inserito nel blocco {...} & catch {...} contiene il codice per rilevare l'eccezione generata dal codice nel blocco try {}.

Infine il blocco {...} contiene il codice eseguito immediatamente dopo il blocco try {} catch {} quando try {} blocca un'eccezione.

es Quando si visita un certo sito web, ma fare per qualche problema lato server non poteva e visualizzazione delle pagine una sorta di messaggio del tipo "errore 404 o del server è l'aggiornamento", questo tipo di codice è scritto in blocco finally.

0

questa semplice cattura è solo per catch eXception ed è in grado di elaborarlo, ma alla fine, eseguire se Eccezione o meno, ad esempio per connessioni chiuse.

1

Utilizziamo try block, catch block e infine block per gestire Exception nel nostro programma. Un programma può avere controllo o deselezionata Eccezione. quindi questo blocco è usato per gestire queste eccezioni. Nel blocco try menzioniamo o scriviamo quei codici che potrebbero essere causa di un'eccezione e se vogliamo che il nostro codice venga eseguito se si verifica un'eccezione, allora scriviamo quei codici nel blocco catch. infine è un blocco molto speciale che ci dà una caratteristica speciale che se il nostro blocco di cattura non viene eseguito prima che il programma vada a terminare, il codice di blocco finale verrà eseguito definitivamente. principalmente questo è usato per salvare i nostri dati durante la chiusura indesiderata del programma. se usiamo il blocco try, allora ci deve essere un blocco catch dopo il blocco try, ma alla fine è un optional non obbligatorio.

0

Infine il blocco è utile per pulire il codice come chiudere i flussi aperti.

es:

File f = new File("\file.txt"); 
    FileStream fs; 
    try{ 
     fs = new FileStream(f); 
    } catch (IOException ioe){ 
     ioe.printStackTrace(); 
    } finally { 
     if (fs != null) { 
     fs.close() // close the stream 
     } 
    } 
0

il tuo codice unico ritorno true/false, quindi non avrà un impatto molto. Ma pensa a qualsiasi altro codice/logica in cui viene scritto un codice obbligatorio/di pulizia da eseguire.

Inoltre, sarà difficile catturare tutte le eccezioni tramite il nostro codice o in altre parole, dovremmo rilevare eccezioni specifiche che possiamo gestire. A quel punto, finally sarà un vero salvatore, poiché verrà sempre eseguito (diverso da System.exit() o in qualche caso di ricorsione).

Inoltre, per garantire la coerenza del nostro codice, è necessario utilizzare sempre il blocco finally per eseguire qualsiasi codice di pulizia.

È possibile fare riferimento i post più sotto troppo per maggiori chiarimenti:

0

primo caso:

Se è verificata un'eccezione nel blo try ck quindi il blocco catch verrà eseguito e, pur servendo lo stesso blocco catch se si verifica nuovamente un'eccezione, il blocco finale verrà eseguito.

Secondo caso:

Se è verificata un'eccezione nel blocco try poi blocco catch sarebbe stato giustiziato, e se c'è un'ulteriore eccezione nello stesso blocco catch poi "return true;" sarebbe eseguito.

Problemi correlati