Annuncio pubblicitario
Un'eccezione nella programmazione indica una condizione eccezionale ad un certo punto dell'esecuzione del programma. Viene utilizzato quando la condizione eccezionale può essere gestita meglio altrove piuttosto che dove si trova. Considera i seguenti esempi:
- La mancata apertura di un file di configurazione può essere gestita meglio nel codice, magari utilizzando un percorso del file di configurazione alternativo.
- Accedere a un articolo array Come utilizzare una Java ArrayListUn arraylist Java è un array ridimensionabile per tutti gli usi. Fornisce la maggior parte delle strutture generalmente previste dagli array in altre lingue. In questo articolo imparerai a configurare e utilizzare un arraylist. Leggi di più al di fuori dei limiti dell'array indica un bug del programma. Buon debug!
- Un errore di analisi XML deve essere segnalato all'utente in modo che il file XML possa essere corretto.
- Il programma esaurendo la memoria (forse durante l'elaborazione di un file di grandi dimensioni) può essere corretto forse aumentando la quantità di memoria disponibile per il processo Java.
In tutti questi casi (e altro), l'eccezione deve essere gestita al di fuori della posizione in cui viene generata in modo da poter affrontare la causa sottostante.
Tipi di eccezioni
L'immagine seguente mostra le parti principali della Gerarchia delle eccezioni Java. La classe base è Throwable che è suddiviso in Eccezione e Errore. Classe Eccezione è per le condizioni relative al programma che le applicazioni possono catturare nel tentativo di salvare la situazione. Classe Errored'altra parte, è per indicare gravi errori nell'ambiente runtime Java che le applicazioni non dovrebbero rilevare. Alcuni esempi sono: OutOfMemoryError e StackOverflowError.
Un Eccezione è di nuovo di due tipi: selezionato e non selezionato. Un'eccezione controllata deve essere gestita dal codice chiamante. Questa regola è applicata dal compilatore java. Un'eccezione non selezionata, d'altra parte, può essere propagata nella catena di chiamate senza doverla dichiarare esplicitamente. Gli esempi seguenti chiariranno.
Eccezioni controllate
Il seguente metodo tenta di creare FileReader da un file. Il costruttore genera un'eccezione controllata FileNotFoundException che deve essere gestito dal codice chiamante o dichiarato lanciato.
Il seguente codice sarà non compilare poiché non fa nessuno dei due.
private void loadFile (String nomefile) {FileReader in = new FileReader (nome file); }
Un modo per ottenere la compilazione del codice è gestire l'eccezione (vedi sotto).
private void loadFile (String nomefile) {provare {FileReader in = new FileReader (nome file)); {} catch (FileNotFoundException ex) {// gestisci l'eccezione qui} }
Se l'eccezione non può essere gestita direttamente dal chiamante, deve essere dichiarata nella firma del metodo.
private void loadFile (String nomefile) genera java.io. FileNotFoundException. {FileReader in = new FileReader (nome file)); { }
Eccezioni non selezionate
Un'eccezione non selezionata è una sottoclasse da RuntimeException e non devono essere gestiti direttamente o dichiarati come sopra. Ad esempio, il seguente codice risulta in a NullPointerException, che è un tipo di RuntimeException. Il codice, tuttavia, viene compilato senza errori da allora NullPointerException è un'eccezione non selezionata.
void privato handleEvent () {Nome stringa = null; if (name.length ()> 0) {} }
Eccezioni di wrapping
Data la discussione di cui sopra sulle eccezioni verificate e non controllate, sembra che sia più facile gestire le eccezioni non controllate poiché non è necessario dichiararle o gestirle da soli. Con questa comodità in mente, a volte può essere utile racchiudere un'eccezione controllata in un'eccezione non selezionata.
L'esempio di codice seguente mostra come racchiudere un'eccezione. Il metodo method_1 () genera un SQLException nel suo corpo. Affinché il codice venga compilato correttamente, l'eccezione deve essere dichiarata come generata.
private void method_1 () genera SQLException {... lanciare nuova SQLException; }
Quando questo metodo viene invocato da un altro metodo (method_2 ()), quel metodo può catturare il SQLException e racchiuderlo in un'eccezione non selezionata, quindi non è necessario dichiarare l'eccezione nella firma del metodo.
private void method_2 () {try {method_1 (); } catch (java.sql. SQLException ex) {lanciare nuova RuntimeException (ex); } }
Traccia stack di eccezione
Una traccia di stack di eccezioni si riferisce alla matrice di frame di stack attivi, ognuno dei quali rappresenta un richiamo del metodo, acquisito dalla JVM al momento del lancio dell'eccezione. Ogni frame dello stack include l'ubicazione dell'invocazione del metodo, inclusi il nome della classe, il nome del metodo e possibilmente il nome del file di origine java e il numero di riga all'interno del file. È utile per risalire alla sequenza delle chiamate che ha causato l'errore Eccezioni Java: le stai gestendo nel modo giusto?Un'eccezione nella programmazione indica una condizione eccezionale nell'esecuzione del programma. Viene utilizzato quando la condizione può essere gestita meglio altrove. Considerare i seguenti esempi di gestione delle eccezioni Java. Leggi di più .
Ecco una tipica traccia dello stack, ottenuta dall'oggetto dell'eccezione quando è stata rilevata.
Eccezione nel thread "main" java.lang. IndexOutOfBoundsException: Index: 8, Dimensione: 5 su java.util. ArrayList.rangeCheck (ArrayList.java: 653) su java.util. ArrayList.get (ArrayList.java: 429) su sample.sample1.main (sample1.java: 24)
L'eccezione presa qui è IndexOutOfBoundsException. Include informazioni aggiuntive sull'errore. La traccia dello stack contiene 3 frame dello stack, ognuno dei quali include le informazioni sulla posizione come mostrato.
Gestire le eccezioni
Un'eccezione può essere gestita catturandola in a prova a prendere bloccare e intraprendere qualsiasi azione correttiva richiesta. Il Eccezione L'oggetto fornisce diversi metodi per estrarre informazioni sulla condizione che lo ha causato.
Il codice seguente registra il messaggio di errore in un file di registro.
private void loadConfig () {try {// invoke code che potrebbe generare una cattura IOException} (java.io. IOException ex) {// gestisce qui l'eccezione. Può essere registrato in un file di registro. log.warning (ex.getMessage ()); } }
Quando un'eccezione viene racchiusa in un'altra, è possibile recuperare l'eccezione spostata:
Causa gettabile = ex.getCause (); log.warning ("Cause sottostanti:" + cause.getMessage ());
Devi accedere alla traccia dello stack e forse estrarre il nome del metodo che l'ha causato?
StringBuilder sbuf = new StringBuilder ("Stack Trace:"); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());
O forse, registrare l'eccezione e ripeterla?
provare {... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); buttare ex; }
Il Eccezione la classe fornisce a printStackTrace () metodo che può stampare la traccia dello stack per conto proprio PrintStream (o PrintWriter).
provare {... } catch (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }
Puoi catturare più tipi di eccezioni in una sola provare bloccare ed eseguire una gestione specifica per ogni tipo di eccezione.
try {// genera alcune eccezioni qui. } catch (java.io. IOException ex) {// Gestione specifica IOException qui. } catch (java.sql. SQLException ex) {// Gestione specifica SQLException qui. }
Per rilevare più tipi di eccezione ma utilizzare lo stesso codice di gestione, è possibile dichiarare a catturare bloccare con più tipi come segue:
try {// genera alcune eccezioni qui. } catch (java.io. IOException | java.sql. SQLException ex) {// IOException e SQLException gestione specifica qui. } catch (SAXException ex) {// Gestione specifica SAXException qui. }
Pulire le risorse con finalmente
Quando si tratta di codice che può generare eccezioni, è essenziale eseguire una corretta pulizia di qualsiasi risorsa, come file aperti Tutto ciò che devi sapere sui formati di file e le loro proprietàUsiamo il file di parole in modo intercambiabile: musica, immagine, foglio di calcolo, presentazione e così via. Ma cosa rende comunque un file un "file"? Proviamo a capire questa parte fondamentale dell'informatica. Leggi di più , connessioni al database, ecc. La pulizia delle risorse deve essere eseguita in a finalmente bloccare. In questo modo sia l'uscita normale che l'uscita eccezionale da un blocco invocano il codice di pulizia I 10 peggiori errori di programmazione nella storiaNel suo passato leggendario, codificare ha portato anche alla distruzione. Le istanze di un po 'di codice errato hanno causato disastri a un livello maggiore. I seguenti sono 10 dei peggiori errori di programmazione nella storia. Leggi di più .
InputStream in = null; provare {... in = new FileInputStream (nome file);... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); } infine il codice {// qui viene eseguito all'uscita dal blocco try, // sia normalmente che a causa di un'eccezione se (in! = null) in.close (); }
Blocco Try-With-Resources
Java 1.7 ha introdotto il risorse try-with- costrutto che semplifica la pulizia delle risorse. Sembra così:
provare (InputStream in = new FileInputStream (..)) {// codice che utilizza InputStream. }
Quando il codice esce dal blocco (in modo pulito o a causa di un'eccezione), il InputStream la variabile viene automaticamente ripulita.
Pulisci più risorse dichiarandole tutte nella testa del blocco.
provare (InputStream in = new FileInputStream (..); Connessione con =...; ) {// codice che utilizza InputStream e la connessione. }
Qualsiasi oggetto la cui classe implementa il AutoCloseable l'interfaccia può essere ripulita in questo modo. La seguente classe esegue alcune pulizie specifiche nel file vicino() metodo.
public class MyClass implementa AutoCloseable {public void close () {// codice di pulizia qui} }
Utilizzare un'istanza di questa classe in a risorse try-with- bloccare.
try (MyClass obj = new MyClass (..)) {// code che utilizza l'oggetto MyClass. }
Alcune eccezioni comunemente riscontrate
Diamo ora un'occhiata ad alcune eccezioni comunemente riscontrate.
- IndexOutOfBoundsException (non selezionato): indica che l'indice dell'elemento a cui si accede è fuori dai limiti di un array, una stringa, ecc.
- SQLException (selezionato): generato a causa di un errore del database.
- IOException (selezionato): errore di accesso al file o errori relativi all'input e all'output.
- InterruptedException (selezionato): lanciato quando l'esecuzione di un thread viene interrotta.
- SAXException (selezionato): generato a causa di errori di analisi XML.
- NullPointerException (deselezionato): utilizza null dove è richiesto un oggetto.
Avvolgendo
Le eccezioni sono il metodo principale per la segnalazione e la gestione degli errori in Java. Uso corretto delle eccezioni migliorare la qualità del codice Scrivi o codice più velocemente nel tuo editor di testo Linux con temi personalizzatiIl tuo editor di testo Linux non deve apparire triste e "funzionale". Perché non modificarlo per migliorare la tua produttività, sia con script e codifica o utilizzando lo strumento come editor di markup? Leggi di più e aiutare a risolvere i problemi di produzione.
Hai delle storie di guerra legate alle eccezioni da mettere in relazione? In tal caso, parlaci nella sezione commenti qui sotto.
Credito di immagine: Dmitry Nikolaev tramite Shutterstock.com