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:
ArithmeticExceptionperché stiamo cercando di dividere un numero per 0.ArrayIndexOutOfBoundsExceptionperché 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.








