Java cattura più eccezioni

In questo tutorial impareremo a gestire più eccezioni in Java con l'aiuto di esempi.

Prima di Java 7, dovevamo scrivere più codici di gestione delle eccezioni per diversi tipi di eccezioni anche se c'era la ridondanza del codice.

Facciamo un esempio.

Esempio 1: più blocchi di cattura

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Produzione

 / per zero 

In questo esempio, possono verificarsi due eccezioni:

  • ArithmeticException perché stiamo cercando di dividere un numero per 0.
  • ArrayIndexOutOfBoundsException perché abbiamo dichiarato un nuovo array intero con limiti di array da 0 a 9 e stiamo cercando di assegnare un valore all'indice 10.

Stiamo stampando il messaggio di eccezione in entrambi i catchblocchi, cioè il codice duplicato.

L'associatività dell'operatore di assegnazione =è da destra a sinistra, quindi ArithmeticExceptionviene lanciato prima un con il messaggio / per zero.

Gestisci più eccezioni in un blocco catch

In Java SE 7 e versioni successive, ora possiamo catturare più di un tipo di eccezione in un singolo catchblocco.

Ogni tipo di eccezione che può essere gestito dal catchblocco viene separato utilizzando una barra o un tubo verticale |.

La sua sintassi è:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Esempio 2: blocco multi-catch

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Produzione

 / per zero 

Catturare più eccezioni in un unico catchblocco riduce la duplicazione del codice e aumenta l'efficienza.

Il bytecode generato durante la compilazione di questo programma sarà più piccolo del programma con più catchblocchi poiché non c'è ridondanza del codice.

Nota: se un catchblocco gestisce più eccezioni, il parametro catch è implicitamente final. Ciò significa che non possiamo assegnare alcun valore ai parametri di cattura.

Eccezione base di cattura

Quando si rilevano più eccezioni in un unico catchblocco, la regola viene generalizzata a specializzata.

Ciò significa che se c'è una gerarchia di eccezioni nel catchblocco, possiamo catturare solo l'eccezione di base invece di catturare più eccezioni specializzate.

Facciamo un esempio.

Esempio 3: cattura solo della classe di eccezione di base

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) ) 

Produzione

 / per zero 

Sappiamo che tutte le classi di eccezione sono sottoclassi della Exceptionclasse. Quindi, invece di catturare più eccezioni specializzate, possiamo semplicemente catturare la Exceptionclasse.

Se la classe di eccezione di base è già stata specificata nel catchblocco, non utilizzare classi di eccezione figlio nello stesso catchblocco. Altrimenti, avremo un errore di compilazione.

Facciamo un esempio.

Esempio 4: cattura di classi di eccezione di base e figlio

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Produzione

 Main.java:6: errore: le alternative in un'istruzione multi-catch non possono essere correlate tramite sottoclassi 

In questo esempio, ArithmeticExceptione ArrayIndexOutOfBoundsExceptionsono entrambe sottoclassi della Exceptionclasse. Quindi, otteniamo un errore di compilazione.

Articoli interessanti...