În acest tutorial, vom învăța să gestionăm mai multe excepții în Java cu ajutorul exemplelor.
Înainte de Java 7, a trebuit să scriem mai multe coduri de gestionare a excepțiilor pentru diferite tipuri de excepții, chiar dacă a existat redundanță de cod.
Să luăm un exemplu.
Exemplul 1: blocuri multiple de captură
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()); ) ) )
Ieșire
/ la zero
În acest exemplu, pot apărea două excepții:
ArithmeticException
pentru că încercăm să împărțim un număr la 0.ArrayIndexOutOfBoundsException
deoarece am declarat o nouă matrice întreagă cu limite de matrice de la 0 la 9 și încercăm să atribuim o valoare indexului 10.
Tipărim mesajul de excepție în ambele catch
blocuri, adică cod duplicat.
Asociativitatea operatorului de atribuire =
este de la dreapta la stânga, deci o ArithmeticException
este aruncată mai întâi cu mesajul / la zero.
Manipulați mai multe excepții într-un bloc de captură
În Java SE 7 și versiunile ulterioare, acum putem prinde mai multe tipuri de excepție într-un singur catch
bloc.
Fiecare tip de excepție care poate fi gestionat de catch
bloc este separat folosind o bară verticală sau o conductă |
.
Sintaxa sa este:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Exemplul 2: bloc 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()); ) ) )
Ieșire
/ la zero
Prinderea mai multor excepții într-un singur catch
bloc reduce duplicarea codului și crește eficiența.
Bytecode-ul generat în timpul compilării acestui program va fi mai mic decât programul care are mai multe catch
blocuri, deoarece nu există redundanță de cod.
Notă: dacă un catch
bloc gestionează mai multe excepții, parametrul catch este implicit final
. Aceasta înseamnă că nu putem atribui nici o valoare parametrilor de captare.
Excepție de captare a bazei
Atunci când prindeți mai multe excepții într-un singur catch
bloc, regula este generalizată la specializată.
Aceasta înseamnă că, dacă există o ierarhie de excepții în catch
bloc, putem prinde excepția de bază numai în loc să prindem mai multe excepții specializate.
Să luăm un exemplu.
Exemplul 3: Prinderea numai a clasei de excepție de bază
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()); ) ) )
Ieșire
/ la zero
Știm că toate clasele de excepție sunt subclasele Exception
clasei. Deci, în loc să prindem mai multe excepții specializate, putem prinde pur și simplu Exception
clasa.
Dacă clasa de excepție de bază a fost deja specificată în catch
bloc, nu utilizați clase de excepție copil în același catch
bloc. În caz contrar, vom primi o eroare de compilare.
Să luăm un exemplu.
Exemplul 4: Prinderea claselor de excepție de bază și copil
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()); ) ) )
Ieșire
Main.java:6: eroare: Alternativele dintr-o declarație multi-catch nu pot fi corelate prin subclasare
În acest exemplu, ArithmeticException
și ArrayIndexOutOfBoundsException
sunt ambele subclase ale Exception
clasei. Deci, primim o eroare de compilare.