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 catch
blocchi, cioè il codice duplicato.
L'associatività dell'operatore di assegnazione =
è da destra a sinistra, quindi ArithmeticException
viene 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 catch
blocco.
Ogni tipo di eccezione che può essere gestito dal catch
blocco 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 catch
blocco 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ù catch
blocchi poiché non c'è ridondanza del codice.
Nota: se un catch
blocco 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 catch
blocco, la regola viene generalizzata a specializzata.
Ciò significa che se c'è una gerarchia di eccezioni nel catch
blocco, 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 Exception
classe. Quindi, invece di catturare più eccezioni specializzate, possiamo semplicemente catturare la Exception
classe.
Se la classe di eccezione di base è già stata specificata nel catch
blocco, non utilizzare classi di eccezione figlio nello stesso catch
blocco. 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, ArithmeticException
e ArrayIndexOutOfBoundsException
sono entrambe sottoclassi della Exception
classe. Quindi, otteniamo un errore di compilazione.