Eccezioni Java le stai gestendo correttamente?

Eccezioni Java le stai gestendo correttamente? / Programmazione

Un'eccezione nella programmazione indica una condizione eccezionale ad un certo punto nell'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 di file di configurazione alternativo.
  • Accesso a un elemento dell'array Come utilizzare un ArrayList Java Come utilizzare un ArrayList Java Un array Array Java è un array di ridimensionamento generale. Fornisce la maggior parte delle strutture generalmente previste per gli array in altre lingue. In questo articolo imparerai a configurare e utilizzare un arraylist. Leggi di più al di fuori dei limiti della matrice indica un bug del programma. Felice debug!
  • Un errore di analisi XML dovrebbe essere portato all'avviso dell'utente in modo che il file XML possa essere corretto.
  • Il programma che esaurisce la memoria (magari durante l'elaborazione di un file di grandi dimensioni) può essere corretto aumentando la quantità di memoria disponibile per il processo java.

In tutti questi casi (e più), l'eccezione dovrebbe essere gestita al di fuori della posizione in cui è generata in modo che la causa sottostante possa essere indirizzata.

Tipi di eccezioni

L'immagine sotto mostra le parti principali della gerarchia delle eccezioni Java. La classe base è Throwable che è sottoclassificato in Eccezione e Errore. Classe Eccezione è per le condizioni relative al programma che le applicazioni possono catturare nel tentativo di salvare la situazione. Classe Errore, d'altra parte, è per indicare errori gravi nell'ambiente run-time Java che le applicazioni non dovrebbero catturare. Alcuni esempi sono: OutOfMemoryError e StackOverflowError.

Un Eccezione di nuovo è di due tipi: selezionato e deselezionato. Un'eccezione controllata deve essere gestita dal codice chiamante. Questa regola è applicata dal compilatore java. Un'eccezione non controllata, d'altra parte, può essere propagata sulla 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 lancia un'eccezione controllata FileNotFoundException che deve essere gestito dal codice chiamante o dichiarato essere gettato.

Verrà il seguente codice non compilare poiché non fa né l'uno né l'altro.

private void loadFile (String filename) FileReader in = new FileReader (nome file);  

Un modo per ottenere il codice da compilare è gestire l'eccezione (vedi sotto).

private void loadFile (String filename) try FileReader in = new FileReader (nome file));  catch (FileNotFoundException ex) // gestisce l'eccezione qui 

Se l'eccezione non può essere gestita direttamente dal chiamante, deve essere dichiarata nella firma del metodo.

private void loadFile (String filename) lancia java.io.FileNotFoundException FileReader in = new FileReader (nome file));  

Eccezioni non selezionate

Un'eccezione non controllata è una eccezione derivata da una sottoclasse RuntimeException e non devono essere gestiti direttamente o dichiarati come sopra. Ad esempio, il codice seguente risulta in a NullPointerException, che è un tipo di RuntimeException. Il codice, tuttavia, compila senza errori da allora NullPointerException è un'eccezione non controllata.

private void handleEvent () String name = null; if (name.length ()> 0)  

Eccezioni di avvolgimento

Considerata la discussione precedente sulle eccezioni controllate e deselezionate, sembra che sia più semplice gestire eccezioni non controllate poiché non è necessario dichiararle o gestirle da soli. Tenendo presente questa comodità, a volte può essere utile racchiudere un'eccezione controllata in un'eccezione non controllata.

Il seguente esempio di codice mostra come avvolgere un'eccezione. Il metodo method_1 () lancia un SQLException nel suo corpo Affinché il codice venga compilato correttamente, l'eccezione deve essere dichiarata per essere generata.

private void method_1 () lancia SQLException ... lancia una nuova SQLException;  

Quando questo metodo è invocato da un altro metodo (method_2 ()), quel metodo può catturare il SQLException e avvolgerlo in un'eccezione non controllata, quindi non deve dichiarare l'eccezione nella sua firma del metodo.

private void method_2 () try method_1 ();  catch (java.sql.SQLException ex) throw new RuntimeException (ex);  

Traccia di stack di eccezione

Una traccia di stack di eccezioni fa riferimento alla matrice di frame di stack attivi, ognuno dei quali rappresenta un'invocazione di metodo, acquisita da JVM nel momento in cui è stata generata l'eccezione. Ogni frame dello stack include il percorso del richiamo 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 tracciare la sequenza di chiamate che hanno causato l'errore Java Eccezioni: le stai gestendo correttamente? Eccezioni Java: le gestisci correttamente? Un'eccezione nella programmazione indica una condizione eccezionale nell'esecuzione del programma. È usato quando la condizione può essere gestita meglio altrove. Considera i seguenti esempi di gestione delle eccezioni Java. Leggi di più .

Ecco una tipica traccia di stack, ottenuta dall'oggetto eccezione quando è stata catturata.

Eccezione nel thread "main" java.lang.IndexOutOfBoundsException: Index: 8, Dimensione: 5 in java.util.ArrayList.rangeCheck (ArrayList.java:653) in java.util.ArrayList.get (ArrayList.java:429) in sample.sample1.main (sample1.java:24) 

L'eccezione catturata qui è IndexOutOfBoundsException. Include informazioni aggiuntive sull'errore. La traccia dello stack contiene 3 frame dello stack, ciascuno dei quali include le informazioni sulla posizione come mostrato.

Gestione delle eccezioni

Un'eccezione può essere gestita catturandola in a prova a prendere bloccare e prendere qualsiasi azione correttiva richiesta. Il Eccezione oggetto fornisce diversi metodi per estrarre informazioni sulla condizione che lo ha causato.

Il seguente codice registra il messaggio di errore in un file di registro.

private void loadConfig () try // invoca il codice che potrebbe generare una cattura IOException (java.io.IOException ex) // gestisce l'eccezione qui. Può essere registrato in un file di registro. log.warning (ex.getMessage ());  

Quando un'eccezione è racchiusa in un'altra, puoi recuperare l'eccezione avvolta:

Throwable causa = ex.getCause (); log.warning ("Causa sottostante:" + causa.getMessage ()); 

Devi accedere allo stack trace e forse estrarre il nome del metodo che lo 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, registra l'eccezione e ricollegala?

prova ... catch (java.io.IOException ex) log.warning (ex.getMessage ()); lanciare ex;  

Il Eccezione la classe fornisce a printStackTrace () metodo che può stampare la traccia dello stack sul proprio PrintStream (o PrintWriter).

prova ... catch (java.io.IOException ex) PrintStream out = ...; out.println (ex.getMessage ()); ex.printStackTrace (out);  

È possibile catturare più tipi di eccezioni in un singolo provare bloccare ed eseguire una gestione specifica per ciascun tipo di eccezione.

prova // getta alcune eccezioni qui catch (java.io.IOException ex) // Gestione specifica IOException qui catch (java.sql.SQLException ex) // SQLException gestione specifica qui 

Per catturare più tipi di eccezione ma utilizzare lo stesso codice di gestione, è possibile dichiarare a catturare bloccare con più tipi come segue:

prova // getta alcune eccezioni qui catch (java.io.IOException | java.sql.SQLException ex) // IOException e SQLException gestione specifica qui catch (SAXException ex) // SAXException gestione specifica qui 

Risanare le risorse con Finalmente

Quando si tratta di codice che può generare eccezioni, è essenziale eseguire una corretta pulizia di tutte le risorse, come i file aperti Tutto quello che c'è da sapere sui formati di file e le loro proprietà Tutto ciò che c'è da sapere sui formati di file e le loro proprietà Usiamo la parola file in modo intercambiabile: musica, immagini, foglio di lavoro, presentazione e così via. Ma cosa rende un file un "file", comunque? Proviamo a capire questa parte fondamentale dell'informatica. Ulteriori informazioni, 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 richiamano il codice di pulizia I 10 peggiori errori di programmazione nella storia I 10 peggiori errori di programmazione nella storia Nel suo passato storico, codifica anche la distruzione. Le istanze di un po 'di codice errato hanno causato disastri su un livello importante. I seguenti sono 10 dei peggiori errori di programmazione nella storia. Leggi di più .

InputStream in = null; prova ... in = new FileInputStream (filename); ... catch (java.io.IOException ex) log.warning (ex.getMessage ());  finally // codice qui viene eseguito all'uscita dal blocco try, // sia normalmente che a causa di un'eccezione if (in! = null) in.close ();  

Blocco Try-With-Resources

Java 1.7 ha introdotto il risorse try-with- costrutto che facilita la pulizia delle risorse. Sembra questo:

provare (InputStream in = new FileInputStream (...)) // codice che utilizza InputStream.  

Quando il codice esce dal blocco (sia pulito che a causa di un'eccezione), il InputStream la variabile viene automaticamente ripulita.

Ripulisci più risorse dichiarandole tutte nella testa del blocco.

provare (InputStream in = new FileInputStream (...); Connection con = ...;) // codice che utilizza InputStream e Connection.  

Qualsiasi oggetto la cui classe implementa il AutoCloseable l'interfaccia può essere pulita in questo modo. La seguente classe esegue una pulizia specifica in vicino() metodo.

La classe pubblica MyClass implementa AutoCloseable public void close () // codice di pulizia qui 

Utilizzare un'istanza di questa classe in a risorse try-with- bloccare.

provare (MyClass obj = new MyClass (...)) // codice che utilizza l'oggetto MyClass.  

Alcune eccezioni comunemente riscontrate

Diamo ora un'occhiata ad alcune eccezioni comunemente riscontrate.

  • IndexOutOfBoundsException (deselezionato): 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 a input e output.
  • InterruptedException (selezionato): generato quando viene interrotta l'esecuzione di un thread.
  • 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 degli errori e la gestione in Java. L'uso corretto delle eccezioni migliora la qualità del codice Scrittura o codice più velocemente nell'editor di testi di Linux con temi personalizzati Scrittura o codice più veloce nell'editor di testi di Linux con temi personalizzati L'editor di testo di Linux non deve apparire sgombro e "funzionale". Perché non modificarlo per migliorare la produttività, sia che si tratti di script e codifica o di utilizzare lo strumento come editor di markup? Leggi di più e aiuta a risolvere i problemi nella produzione.

Hai qualche storia di guerra legata alle eccezioni da mettere in relazione? Se è così, parlaci nella sezione commenti qui sotto.

Immagine di credito: Dmitry Nikolaev tramite Shutterstock.com

Scopri di più su: Java, programmazione.