Java captează mai multe excepții

Î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 catchblocuri, adică cod duplicat.

Asociativitatea operatorului de atribuire =este de la dreapta la stânga, deci o ArithmeticExceptioneste 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 catchbloc.

Fiecare tip de excepție care poate fi gestionat de catchbloc 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 catchbloc 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 catchblocuri, deoarece nu există redundanță de cod.

Notă: dacă un catchbloc 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 catchbloc, regula este generalizată la specializată.

Aceasta înseamnă că, dacă există o ierarhie de excepții în catchbloc, 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 Exceptionclasei. Deci, în loc să prindem mai multe excepții specializate, putem prinde pur și simplu Exceptionclasa.

Dacă clasa de excepție de bază a fost deja specificată în catchbloc, nu utilizați clase de excepție copil în același catchbloc. Î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 ArrayIndexOutOfBoundsExceptionsunt ambele subclase ale Exceptionclasei. Deci, primim o eroare de compilare.

Articole interesante...