Introducere în gestionarea excepțiilor
În procesul de execuție a programului pot apărea adesea erori, iar acestea nu sunt întotdeauna cauzate de dezvoltator. Unele dintre ele sunt greu de anticipat sau chiar imposibil de prevăzut. De exemplu, o conexiune de rețea poate fi întreruptă brusc în timpul transferului unui fișier. Aceste situații se numesc excepții.
Limbajul Java oferă instrumente speciale pentru gestionarea acestor situații. Unul dintre aceste instrumente este structura try...catch...finally. Când apare o excepție în blocul try, controlul trece la blocul catch, care poate gestiona excepția respectivă.
Dacă nu este găsit un astfel de bloc, utilizatorului îi este afișat un mesaj de excepție negestionată, iar execuția programului se oprește. Pentru a evita această oprire, este necesar să folosim blocul try..catch. De exemplu:
int[] numbers = new int[3];
numbers[4] = 45;
System.out.println(numbers[4]);
Deoarece tabloul numbers poate conține doar 3 elemente, când se execută instrucțiunea numbers[4] = 45, consola va afișa o excepție și execuția programului va fi oprită. Acum, să încercăm să gestionăm această excepție:
try {
int[] numbers = new int[3];
numbers[4] = 45;
System.out.println(numbers[4]);
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("Programul s-a încheiat");
Când folosim blocul try...catch, toate instrucțiunile dintre operatorii try și catch sunt executate. Dacă apare o excepție în blocul try, ordinea normală de execuție este oprită și controlul trece la instrucțiunea catch. Astfel, când execuția programului ajunge la linia numbers[4] = 45;, aceasta se va opri și va trece la blocul catch.
Instrucțiunea catch are următoarea sintaxă: catch (tip_excepție nume_variabilă). În acest caz, se declară variabila ex, care are tipul Exception. Însă, dacă excepția apărută nu este de tipul specificat în instrucțiunea catch, aceasta nu este gestionată, iar programul se oprește sau afișează un mesaj de eroare.
Deoarece Exception este clasa de bază pentru toate excepțiile, instrucțiunea catch (Exception ex) va gestiona aproape toate excepțiile. Gestionarea excepției, în acest caz, constă în afișarea în consolă a stivei de urmărire a erorilor cu ajutorul metodei printStackTrace(), definită în clasa Exception.
După finalizarea execuției blocului catch, programul continuă cu toate instrucțiunile care urmează după blocul catch.
Structura try..catch poate avea, de asemenea, un bloc finally. Totuși, acest bloc este opțional și poate fi omis în gestionarea excepțiilor. Blocul finally se execută în orice caz, fie că a apărut o excepție în blocul try, fie că nu:
try {
int[] numbers = new int[3];
numbers[4] = 45;
System.out.println(numbers[4]);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
System.out.println("Blocul finally");
}
System.out.println("Programul s-a încheiat");
Gestionarea mai multor excepții
În Java, există multe tipuri de excepții și putem delimita gestionarea lor prin includerea de blocuri catch suplimentare:
int[] numbers = new int[3];
try {
numbers[6] = 45;
numbers[6] = Integer.parseInt("gfd");
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("Depășire a limitelor tabloului");
} catch (NumberFormatException ex) {
System.out.println("Eroare la conversia din șir în număr");
}
Dacă apare o excepție de un anumit tip, aceasta trece la blocul catch corespunzător.
Operatorul throw
Pentru a raporta apariția unei situații excepționale în program, putem folosi operatorul throw. Cu ajutorul acestui operator, putem crea manual o excepție și o putem declanșa în timpul execuției. De exemplu, dacă într-un program se introduce un număr și dorim ca, în cazul în care numărul este mai mare de 30, să apară o excepție:
package firstapp;
import java.util.Scanner;
public class FirstApp {
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
int x = in.nextInt();
if(x >= 30){
throw new Exception("Numărul x trebuie să fie mai mic de 30");
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
System.out.println("Programul s-a încheiat");
}
}
Aici, pentru crearea unui obiect de excepție, se folosește constructorul clasei Exception, în care este transmis un mesaj de excepție. Dacă numărul x este mai mare de 29, se declanșează o excepție, iar controlul trece la blocul catch.
În blocul catch, putem obține mesajul excepției folosind metoda getMessage().