2013-07-31 14 views
6

Quanto meglio è:Qual è il costo dei blocchi catch catch?

if (condition) { 
    try { 
    //something 
    } catch(SomeEx ex) {} 
} 

invece di questo:

try { 
    if (condition) { 
    //something 
    } 
} catch(SomeEx ex) {} 

Che cosa realmente JVM fanno quando entro provare blocco?

MODIFICA: Non voglio sapere che nel secondo esempio si entra sempre per provare ... Si prega di rispondere alla domanda.

+1

Dipende dal vostro utilizzo e lo scenario attuale. –

+0

@Nandkumar Tekale: Non è vero .. È sempre lo stesso. Poiché abbiamo lo stesso JAVA. – Smolda

+0

Possibile duplicato di [È costoso usare blocchi try-catch anche se non viene mai lanciata un'eccezione?] (Http: // stackoverflow.it/questions/16451777/is-it-cost-to-use-try-catch-blocks-even-if-an-exception-is-never-throw) – e4c5

risposta

7

Esecuzione saggia in fase di esecuzione, a patto che non ci siano eccezioni, provare non costa nulla. Costa solo il tempo di esecuzione non appena si verifica un'eccezione. E in quella situazione è molto più lento che una valutazione se.

Nel spec JVM, si vede che non c'è codice di byte in più generato sul percorso di esecuzione: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.12

+1

T0 aload_0 // Inizia blocco try – Smolda

+1

@Smolda - Non capisco il tuo commento. Vuoi dire che il 'aload_0' nel codice di esempio della specifica è per il tentativo? Quello non è vero. È il caricamento del riferimento 'this' per la chiamata al metodo nella riga successiva. E questo è necessario, non importa se usi o meno la prova. Il commento nel codice di esempio è un po 'fuorviante. – FrankPl

+0

+1 per il riferimento esatto – linski

0
if (condition) { 
    try { 
    //something 
    } catch(SomeEx ex) {} 
} 

è meglio usare dal momento che esegue il blocco try se la condizione è ok.JVM compila il blocco try e convalidato il blocco catch o un blocco finally. Penso che il vantaggio non sia nel tempo di compilazione ma nel tempo di esecuzione. Tempo di compilazione Non ritengo alcun vantaggio

+0

Questo è quello che ho detto .. puoi rispondere alla domanda ? – Smolda

+0

JVM compila il blocco try e convalida il blocco catch o un blocco finally. Penso che il vantaggio non sia nel tempo di compilazione ma nel tempo di esecuzione. Compilare il tempo penso che non ci sia alcun vantaggio –

0

Le eccezioni dovrebbero essere un caso eccezionale, non ogni volta che il codice viene eseguito. Quindi meglio controllare la condizione prima di try ing!

if (condition) { 
    try { 
    //something 
    } catch(SomeEx ex) {} 
} 

Assicurarsi, if (condition) per sé non genera Exception.

Dipende dal vostro utilizzo e funzionalità. Per esempio, questo sarebbe meglio:

if (someObject!=null) { 
    try { 
    someObject.getSomething(); // getSomething() potentially throws some Exception 
    } catch(SomeEx ex) {} 
} 

Che cosa realmente JVM fanno quando entro provare blocco?

Leggi JVM spec 2.10.

+0

+1 Mi piace il tuo preventivo JLS molto meglio del mio :) – linski

+0

Questo non ha senso. Se la condizione è improbabile, il sovraccarico di test e cattura è ingiustificato, e il suggerimento introduce anche (a) un problema con la finestra temporale (b) il problema di testare esattamente la stessa condizione due volte e (c) il problema di dover scrivere lo stesso errore che gestisce il codice due volte. -1 – EJP

+2

@EJP (1) Non sono d'accordo con te, è meglio evitare un certo NPE piuttosto che chiedere di provare a lanciarlo successivamente. (2) non sta testando la stessa condizione due volte, si prega di leggere il commento nel codice (3) farei meglio ad avere il mio catch catch per catturare le potenziali eccezioni controllate piuttosto che le eccezioni di runtime! – NINCOMPOOP

3
try {if (condition) {...}} catch(SomeEx ex) {} 

Qui ha gestito l'eccezione se si tratta di condizioni arised di se anche se arised all'interno if-block.

if (condition) {try {...} catch(SomeEx ex) {}} 

Qui gestire un'eccezione se è arised solo all'interno del if-block. Se qualcosa va storto in condizione, allora non sarà gestito.

Quindi dipende dall'effettivo senario.

1

Dal punto di vista della perfomance dovrebbe essere lo stesso. Il lancio dell'eccezione è un'operazione costosa (per i principianti, lo stacktrace deve essere creato e popolato). La semplice esistenza del blocco try non ha (o trascura) penalità di performance.

Vedere Should java try blocks be scoped as tightly as possible.

Cosa fa JVM quando inserisco il blocco try?

Da JLS 14.20.1. Execution of try-catch:

Un'istruzione try senza un blocco finally viene eseguito dalla prima esecuzione del blocco try.Poi v'è una scelta:

  • Se l'esecuzione del blocco try completa normalmente, quindi non viene eseguita alcuna ulteriore azione e l'istruzione try termina normalmente.

  • Se l'esecuzione del blocco try completa bruscamente a causa di un lancio di un valore V, allora v'è una scelta:

    • Se il tipo di runtime di V è compatibile con assegnazione (§5.2) una classe di eccezioni catchable di qualsiasi clausola catch dell'istruzione try, quindi viene selezionata la prima (più a sinistra) tale catch catch. Il valore V viene assegnato al parametro della clausola catch selezionato, e viene eseguito il blocco di tale clausola catch, e quindi v'è una scelta:

      • Se quel blocco completa normalmente, allora l'istruzione try termina normalmente .

      • Se quel blocco si completa bruscamente per qualsiasi motivo, la dichiarazione di prova viene completata improvvisamente per lo stesso motivo.

    • Se il tipo di runtime di V non è compatibile con l'assegnazione di una classe di eccezione catturabile di qualsiasi clausola catch dell'istruzione try, poi l'istruzione try completa bruscamente a causa di un lancio del valore V.

  • Se l'esecuzione del blocco try viene completata improvvisamente per qualsiasi altro motivo, l'istruzione try viene completata improvvisamente per lo stesso motivo.

EDIT:

Per una descrizione completa delle eccezioni vedere la JVM 2.10 link in risposta di The New Idiot.

0

If you see oracle docs

>try { 
    code 
} 
catch and finally blocks . . . 

Il segmento nel codice di esempio con l'etichetta contiene uno o più legali righe di codice che potrebbe generare un'eccezione.

Quindi, se ti senti in dubbio la vostra Se la condizione che essa throw un exception metterlo inside.Otherwise messo fuori.