Java Try Catch Finally blocca senza Catch

Sto rivedendo del nuovo codice. Il programma ha solo una prova e un blocco finale. Poiché il blocco di cattura è escluso, come funziona il blocco try se incontra un’eccezione o qualcosa che può essere lanciato? Va direttamente al blocco finale?

Se uno qualsiasi dei codici nel blocco try può lanciare un’eccezione controllata, deve comparire nella clausola throws della firma del metodo. Se viene generata un’eccezione non controllata, viene fuori dal metodo.

Il blocco finally viene sempre eseguito, indipendentemente dal fatto che venga lanciata un’eccezione o meno.

Una piccola nota su try / finally : The finally verrà sempre eseguita a meno che

  • Si chiama System.exit() .
  • La JVM si arresta in modo anomalo.
  • Il blocco try{} non finisce mai (es. Loop infinito).

Java Language Specification (1) descrive come viene eseguito try-catch-finally . Non avere cattura è equivalente a non avere una cattura in grado di catturare il dato Throwable.

  • Se l’esecuzione del blocco try termina bruscamente a causa di un lancio di un valore V, allora c’è una scelta:
    • Se il tipo di tempo di esecuzione di V è assegnabile al parametro di qualsiasi clausola catch dell’istruzione try, quindi …
    • Se il tipo di esecuzione di V non è assegnabile al parametro di alcuna clausola catch dell’istruzione try, viene eseguito il blocco finally . Quindi c’è una scelta:
      • Se il blocco finally viene completato normalmente, l’istruzione try viene completata improvvisamente a causa di un lancio del valore V.
      • Se il blocco finally termina bruscamente per la ragione S, allora l’istruzione try termina bruscamente per la ragione S (e il lancio del valore V viene scartato e dimenticato).

(1) Esecuzione di try-catch-finally

L’interiore infine viene eseguito prima di lanciare l’eccezione al blocco esterno.

 public class TryCatchFinally { public static void main(String[] args) throws Exception { try{ System.out.println('A'); try{ System.out.println('B'); throw new Exception("threw exception in B"); } finally { System.out.println('X'); } //any code here in the first try block //is unreachable if an exception occurs in the second try block } catch(Exception e) { System.out.println('Y'); } finally { System.out.println('Z'); } } } 

Risultati in

 A B X Y Z 

Il blocco finally viene sempre eseguito dopo che il blocco try termina, indipendentemente dal fatto che il tentativo termina normalmente o anormalmente a causa di un’eccezione, er, throwable.

Se un’eccezione viene lanciata da uno qualsiasi del codice all’interno del blocco try, allora il metodo corrente semplicemente re-getta (o continua a lanciare) la stessa eccezione (dopo aver eseguito il blocco finally).

Se il blocco finally lancia un’eccezione / errore / lancio, e c’è già un lancio in sospeso, diventa brutto. Francamente, dimentico esattamente cosa succede (tanto per la mia certificazione anni fa). Penso che entrambi i materiali pubblicitari siano collegati tra loro, ma c’è un po ‘di voodoo speciale che devi fare (es. Una chiamata al metodo dovrei cercare) per ottenere il problema originale prima che “finalmente”, vomitato, vomitasse.

Per inciso, provare / finalmente è una cosa abbastanza comune da fare per la gestione delle risorse, dal momento che Java non ha distruttori.

Per esempio –

 r = new LeakyThing(); try { useResource( r); } finally { r.release(); } // close, destroy, etc 

“Finalmente”, un altro consiglio: se ti preoccupi di inserire una presa, prendi sottoclassi throwable specifiche (previste) o prendi semplicemente “Throwable”, non “Exception”, per una trappola di errore generale catch-all. Troppi problemi, come ad esempio il riflesso, gettano “Errori”, piuttosto che “Eccezioni”, e quelli scivoleranno proprio su qualsiasi “catch all” codificato come:

 catch ( Exception e) ... // doesn't really catch *all*, eh? 

fallo invece:

 catch ( Throwable t) ... 

Le versioni Java precedenti alla versione 7 consentono queste tre combinazioni di try-catch-finally

 try - catch try - catch - finally try - finally 

finally blocco verrà sempre eseguito indipendentemente da ciò che sta accadendo nel try o / e nel catch block. quindi se non ci sono blocchi catch , l’eccezione non verrà gestita qui.

Tuttavia, avrai ancora bisogno di un gestore di eccezioni da qualche parte nel tuo codice, a meno che tu non voglia che la tua applicazione si arresti completamente, naturalmente. Dipende dall’architettura della tua applicazione esattamente dove si trova quel gestore.

  • Il blocco try Java deve essere seguito da catch o finally block.
  • Per ogni blocco try possono esserci zero o più blocchi catch, ma solo un blocco finally.
  • Il blocco finally non verrà eseguito se il programma termina (chiamando System.exit () o provocando un errore fatale che causa l’interruzione del processo).

come funziona il blocco di prova se incontra un’eccezione o qualcosa di gettato

L’eccezione viene buttata fuori dal blocco, proprio come in ogni altro caso in cui non viene catturato.

Il blocco finally viene eseguito indipendentemente dal modo in cui il blocco try viene chiuso, indipendentemente dal fatto che ci siano dei catch, indipendentemente dal fatto che ci sia un catch corrispondente.

I blocchi catch e infine sono parti ortogonali del blocco try. Puoi avere uno o entrambi. Con Java 7, sarai in grado di non avere nessuno dei due!

Non lo provi con quel programma? Finirà per bloccare ed eseguire il blocco finally, ma l’eccezione non verrà gestita. Ma quell’eccezione può essere annullata nel blocco finale!

Il blocco finally viene eseguito dopo il completamento del blocco try. Se qualcosa viene gettato all’interno del blocco try quando lascia il blocco finally viene eseguito.