2010-07-28 10 views
36

Non ho mai capito bene l'uso dell'ultima frase. Qualcuno può dirmi qual è la differenza tra:come usare finalmente

try { 
    a; 
    block; 
    off; 
    statements; 
} catch (Exception e) { 
    handle; 
    exception; 
    e; 
} finally { 
    do; 
    some; 
    cleanup; 
} 

da un lato, e:

try { 
    a; 
    block; 
    off; 
    statements; 
} catch (Exception e) { 
    handle; 
    exception; 
    e; 
} 
do; 
some; 
cleanup; 

D'altra

risposta

35

differiscono se

  • il -block try completa gettando un java.lang.Throwable che non è un java.lang.Exception, ad esempio perché è un java.lang.Error come AssertionError o OutOfMemoryError.
  • try-block completa bruscamente utilizzando un rendiconto controllo tale continue, break o return
  • il fermo-block completa bruscamente (gettando qualsiasi throwable, o utilizzando un rendiconto controllo)

Altro in generale, il linguaggio java garantisce che un blocco finally venga eseguito prima che l'istruzione try venga completata. (Si noti che se l'istruzione try non viene completata, non esiste una garanzia definitiva. Una dichiarazione potrebbe non essere completata per una serie di motivi, tra cui arresto hardware, arresto del sistema operativo, arresto VM (ad esempio a causa di System.exit), la discussione in attesa (Thread.suspend(), synchronized, Object.wait(), Thread.sleep()) o essere altrimenti occupato (loop senza fine, ,,,).

Quindi, un blocco finally è un posto migliore per le azioni di pulizia rispetto alla fine del corpo del metodo, ma

7

In corretto stile di codifica non si vuole fare un fermo tutto come sotto.

try{ 
    [some task] 
} 
catch 
{ 
} 

Quello che vorresti fare è catturare specifici errori noti.

try{ 
    [some task] 
} 
catch(Exception ex) 
{ 
    if([known execption]) 
    [ignore] 
    else 
    throw(ex); 
} 
[Cleanup] 

In questo caso il codice di pulizia non verrà eseguito in caso di un errore di nuovo. Quindi aggiungiamo infine quello che verrà eseguito anche se viene generato un nuovo errore.

try{ 
    [some task] 
} 
catch(Exception ex) 
{ 
    if([known execption]) 
    [ignore] 
    else 
    throw(ex); 
} 
finally 
{ 
    [Cleanup] 
} 
27

finally blocco eseguito sempre.

finally blocco viene utilizzato per la pulizia, come a liberare risorse utilizzate all'interno try/catch, chiudere le connessioni db, vicino prese, ecc .. anche quando un'eccezione non gestita si verifica all'interno del vostro blocco try/catch.

L'unica volta il blocco finally non viene eseguito è quando system.exit() è chiamato in try/catch o qualche errore si verifica invece un'eccezione.

L'errore nella descrizione sopra indica quando l'applicazione Java termina con condizioni come Errore memoria esaurita. Vedo alcuni downvotes :(per questo motivo sembra

+2

Correzione: un blocco finally _is_ eseguito quando viene lanciato un java.lang.Error. Potrebbe non essere eseguito correttamente, ma viene eseguito. le definizioni che possono ostacolare l'esecuzione di un blocco finale, vedere la mia risposta per un elenco incompleto. – meriton

+0

Nota: se la JVM termina mentre viene eseguito il codice try o catch, allora il blocco finally potrebbe non essere eseguito. Allo stesso modo, se il thread che esegue il codice try o catch viene interrotto o ucciso, il blocco finally potrebbe non essere eseguito anche se l'applicazione continua nel suo complesso. - https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – Hansa

18

La differenza principale è che la sezione catch potrebbe lanciare un'eccezione, uscire da un blocco circostante o ritornare dal metodo corrente. In tal caso, do; some; cleanup; non è . eseguiti

Con un blocco finally, è garantito che verrà eseguito il codice

+0

È finalmente garantito l'esecuzione? http://stackoverflow.com/questions/464098/does-a-finally-block-always-run –

+0

Sì, non nel caso di System.exit(), è vero. O, sai, un crash JVM. – Dan

+2

... o un deadlock, o ... - la vera regola è: Un blocco finally è garantito che è stato eseguito quando/se l'istruzione try- (catch) -finally è stata completata. – meriton

10

E 'fondamentalmente una cattiva idea per catturare tutte le eccezioni -. quindi è necessario considerare che cosa accadrà se un non gestite fanno propaga eccezione fuori dal tuo try/catch o try/catch/finally block. Finalmente i blocchi ti permettono per ripulire la via d'uscita.

anche:

  • Il blocco catch potrebbe generare un'eccezione
  • Si consiglia di tornare dal blocco try

In breve, se si vuole un po 'di codice da eseguire quando si lasciare il blocco try/catch tuttavia lo stai lasciando (a parte il processo che viene terminato molto duramente), finalmente è tuo amico.

7

Il blocco "finally" verrà sempre eseguito.

Nel secondo esempio, la pulitura non si verificherebbe se il blocco catch rilancia l'eccezione o se si è verificata un'eccezione non rilevata nel blocco try.

+0

Esistono numerose condizioni in cui l'ultimo non viene eseguito (c.f. la mia risposta), ma si è certi che le eccezioni di lancio (o l'uso di istruzioni di controllo del flusso) non sono tra queste. – meriton

3

Da this forum sul GeekInterview:

blocco finally sempre eseguito quando il blocco try. Ciò garantisce che il blocco finally venga eseguito anche se si verifica un'eccezione imprevista. Ma alla fine è utile non solo per la gestione delle eccezioni, ma consente al programmatore di evitare che il codice di pulizia venga ignorato accidentalmente da un ritorno, una continuazione o un'interruzione. Mettere il codice di pulizia in un blocco finale è sempre una buona pratica, anche quando non sono previste eccezioni.

1

semplicemente una riga di spiegazione:

indipendentemente dal fatto che hai preso un'eccezione o no, i codici nel blocco finally otterrà eseguito.

il diff tra i due pezzi che hai dato qui è: i codici nel pezzo senza usare finally non verranno mai eseguiti.

per comprendere correttamente finally, tutto ciò che dovete sapere è che finally = garanzia!

si può usare per pulire, per aiutare w/facilità d'uso o di riprovare qualcosa

0

Nel primo esempio il blocco finally viene sempre eseguito, anche se si dispone di una dichiarazione di ritorno nella clausola try. L'unica volta che non viene eseguito è quando si ha System.exit (0).

+0

ci sono numerose altre condizioni in cui l'ultimo non viene eseguito, c.f. la mia risposta (che non pretende di darle tutte ...) – meriton