2011-09-13 10 views
14

Quando devo usare frammento di codice A invece di frammento di B (vale a dire quali sono i vantaggi di utilizzare frammento A) ?:Quando devo usare il fine-blocco di Java try-catch-finally

Snippet A:

try { 
    // codeblock A 
} 
catch (Exception ex) { 
    // codeblock B 
} 
finally { 
    //codeblock C 
} 

Snippet B:

try { 
    // codeblock A 
} 
catch (Exception ex) { 
    // codeblock B 
} 

//codeblock C 
+1

Correlato: http://stackoverflow.com/questions/3354823/how-to-use-finally – birryree

risposta

15

Utilizzare un blocco finally, se si dispone di codice che deve all'e xecute indipendentemente dal fatto che venga generata o meno un'eccezione.

Eliminare risorse scarse come le connessioni di database sono un buon esempio.

+0

È anche una buona pratica perché indica esplicitamente cosa sta succedendo, ad es. indipendentemente dall'esecuzione, è necessario liberare la risorsa x, ecc. – Tony

+0

Nota: in Java 7 è possibile utilizzare un'istruzione try-with-resources per chiudere determinate risorse, quindi in questo caso non sarà necessario un 'finally'. – dogbane

+1

@duffymo Ma non ci sarebbe anche 'codeblock C' in _snippet B_? – poplitea

1

È utile se è necessario eseguire una pulizia, ad es. chiudere una connessione al database. Poiché "finally" viene sempre eseguito, non è necessario eseguire la copia-incolla soggetta a bug dello stesso codice alla fine del "try" e anche in uno o più blocchi "catch".

3

Un caso ovvio è quando si controrilancia o si lancia un'altra eccezione nel blocco catch.

1

È necessario utilizzare quasi sempre lo snippet con blocco finally quando si dispone di risorse che devono essere pulite in entrambi gli scenari di errore o di successo. Un tipico esempio è l'oggetto di connessione jdbc che dovrebbe essere sempre chiuso (ripulire) nel blocco finally.

0

Immaginate di avere una dichiarazione return all'interno del blocco catch: il C blocco non sarà eseguito in frammento B, ma nel frammento Un sarà, prima di tornare.