Procesul de programare va fi mereu însoțit și de diverse probleme legate de viitorul soft. Programatorului îi revine misiunea de a prezice care sunt aceste probleme ce pot apărea în procesul execuției software-ului și de a reduce la minim apariția acestora.
O excepție este un eveniment anormal ce apare în timpul execuției unui program şi duce la oprirea acestuia.
Procesul de izolare a situațiilor excepționale și controlul comportării aplicației în momentul apariției acestora este numit tratarea excepțiilor.
O excepție poate fi generată din diverse motive: împărțirea la 0, deschiderea unui fişier care nu există, accesarea indexului unui tablou care depășește limitele acestuia, ș.a.
Java pune la dispoziția programatorilor clasa Throwable din care sunt extinse toate celelalte excepții, şi care face parte din următoarea ierarhie:
Clasa Object este părintele tuturor claselor Java.
Clasa Throwable împarte excepțiile în 2 categorii :
- Verificate (checked): sunt excepții verificate la faza de compilare. Nu țin de algoritm, ci de anumite condiții care ar putea afecta execuția programului (ex. fișier absent, date de intrare nevalide, probleme ce țin de baze de date, ș.a). Dacă un oarecare cod dintr-o metodă ar putea genera o astfel de excepție atunci este obligatoriu de a oferi un mecanism de tratate a acesteia fie prin try...catch fie cu ajutorul cuvântul rezervat throws, în caz contrar aplicația nu va putea fi lansată la execuție. Programatorul este forțat să trateze așa tip de excepții.
- Neverificate (unchecked): sunt excepții care nu sunt verificate la faza de compilare ci la faza de execuție, și sunt o consecință a neatenției programatorului la elaborarea algoritmului (ex. împărțirea la 0, accesarea unui membru care nu există, ș.a). Acestea deasemenea pot fi tratate, însă la discreția programatorului.
În Java excepțiile derivate din clasele Error și RuntimeException sunt excepții neverificate (unchecked), orice altă clasă de excepție derivată din Throwable este verificată (checked).
Instanțele clasei Error reprezintă erori interne, nerecuperabile, ale mediului de lucru Java. Aceste erori sunt rare şi de obiecei fatale, nu le putem intercepta, însă există pentru ca Java să le poată folosi dacă are nevoie de ele.
Iata câteva excepții predefinite ale limbajului Java:
ArithmeticException
|
Eroare
de tip aritmetic, de exemplu împărțire la zero.
|
ArrayIndexOutOfBoundsException
|
Indexul
din sir este în afara limitelor
|
ArrayStoreException
|
Se
încearcă atribuirea unui element din șir cu o valoare incorectă.
|
ClassCastException
|
Cast
incorect.
|
IllegalArgumentException
|
Parametrul
transmis metodei este greșit.
|
IndexOutOfBoundsException
|
Indexul
este în afara limitelor
|
NullPointerException
|
Folosirea
obiectului neinstanțiat (egal cu null).
|
NumberFormatException
|
Conversia
dintr-un string într-un numar a eșuat.
|
StringIndexOutOfBounds
|
Indexul
unui string este in afara limitelor
|
IllegalAccessException
|
Acces
la clasa nepermis.
|
NoSuchFieldException
|
S-a
încercat accesarea unui membru care nu exista.
|
NoSuchMethodException
|
S-a
încercat accesarea unei metode care nu exista.
|
Java, la fel ca alte limbaje de programare, oferă tehnici speciale ce permit interceptarea și tratarea excepțiilor într-un mod standard și destul de comod.
În Java tratarea excepțiilor este obligatorie, orice secvență de cod ce poate provoca excepții trebuie să fie însoțită şi de o modalitate de tratare a acesteia:
1) declararea excepției în semnătură metodei:
De exemplu:
Blocul try blochează toate instrucțiunile ce pot genera excepții. Are sintaxa :
try{
// instrucțiuni ce pot genera excepții
}
1) declararea excepției în semnătură metodei:
De exemplu:
public static void main(String [] args) throws FileNotFoundException {
// corpul metodei ce conține codul ce poate genera excepții
}
2) folosind blocurile try ... catch...finally: Blocul try blochează toate instrucțiunile ce pot genera excepții. Are sintaxa :
try{
// instrucțiuni ce pot genera excepții
}
Rețineți!
1) Un bloc try poate fi urmat fie de un bloc catch fie de un bloc finally, însă nu poate exista
de unul singur.
2) Dacă instrucțiunile grupate de blocul try vor genera o excepție aceasta va fi tratată de
blocul catch corespunzător tipului de eroare aruncată (generată).
3) Dacă instrucțiunile se vor executa cu succes nu se va mai ține cont de tratarea
excepțiilor şi aplicaţia se va executa în mod normal.
Blocul catch este blocul în care sunt tratate excepțiile. Are sintaxa :
catch (ClasaDeExceptii numeVariabila{
// instrucţiuni de tratare
}
ClasaDeExceptii reprezintă clasa excepției tratate. numeVariabila este o variabilă cu ajutorul căreia putem accesa metodele clasei excepției tratate. Deseori cu această variabilă nu se lucrează dar şi în acest caz ea trebuie declarată obligatoriu altfel obținem eroare sintactică precum că nu s-a respectat sintaxa instrucţiunii catch.
Rețineți!
1) Blocul catch NU poate exista singur, ci doar însoțit de un bloc try.
try {...
}catch(...){
}
2) Între blocul try şi primul bloc catch nu pot exista alte instrucțiuni.
3) Un bloc try poate fi însoțit de orice număr de blocuri catch.
3) Un bloc try poate fi însoțit de orice număr de blocuri catch.
Dacă în exemplul de mai sus vom încerca să afișăm s[1] vom obține la ecran valoarea 2.
Blocul finally nu apare niciodată singur ci în asociere cu blocul try. Cuprinde codul care trebuie să se execute indiferent dacă apar excepții în blocul try sau nu.
Prin clauza finally instrucțiunea try... catch devine completă.
Acest bloc are sintaxa :
finally {
// instrucțiuni executate indiferent
}
Instrucțiunea try...catch...finally are următoarea formă completă :
finally {
// instrucțiuni executate indiferent
}
Instrucțiunea try...catch...finally are următoarea formă completă :
Exemplu:
class exe6 {
public static void main(String [] args){
int x= (int)(Math.random()*5);
int y= (int)(Math.random()*8);
int [] z={1,2,3,4,5};
try {
System.out.println("Sau generat numerel : "+x+" "+y);
System.out.println("x/y este "+x/y);
System.out.println("y="+y+"z[y]="+z[y]);
}catch (ArithmeticException e1 ){
System.out.println("problema aritmetica : Impartire la 0");
}catch (IndexOutOfBoundsException e2){
System.out.println("depasire de index"+e2);
}finally { System.out.println("Elaborat de mine !");
}}
}
import java.util.*;
public class Exemplul_3 {
public static void main(String [] args){
int nr;
Scanner in = new Scanner(System.in);
try{
nr = in.nextInt();
if (nr < 0) throw new MyExceptionPozitiv();
if (nr%2==0) System.out.println("Numar par !");
else System.out.println("Numar impar !");
}catch ( InputMismatchException ex){
System.out.println("Introduceti un numar intreg!!!");
} catch (MyExceptionPozitiv ex) {
System.out.println(ex);
} in.close();
}}
class MyExceptionPozitiv extends Exception{
MyExceptionPozitiv() {}
public String toString(){
return "Valoarea introdusa nu este pozitiva";
Programatorul, la rândul său deasemenea poate defini și genera excepții proprii cu ajutorul instrucțiunii throw.
De obicei de acest lucru este nevoie atunci când apare o situație în care oricare excepție predefinită Java nu este relevantă. Pentru aceasta este suficient de a definiti o clasa derivată din Exception.
Clasele derivate de utilizator nu trebuie sa implementeze nimic, simpla lor apartenență la ierarhia de tipuri permite utilizarea lor ca excepții.
Clasele create de utilizator dispun, prin moștenire, de proprietățile și metodele definite de clasa Exception.
Pentru a trata o astfel de excepție în clasa test se va crea forțat o astfel de excepție.
Rețineți!
Cu ajutorul cuvântului rezervat throw avem posibilitatea de a crea explicit un tip de excepție propriu, adică putem crea o instanță excepție, arunca și trata la faza de execuție. Se folosește nemijlocit însoțită de blocul try. Cuvântul rezervat throws ne ajută atunci când dorim să aruncăm, sau transferăm eroarea, astfel încât aceasta să fie tratată de compilator automat, adică eroarea nu va fi tratată de noi explicit într-un bloc try.
Cuvântul rezervat throws se scrie în semnătura metodei codul căreia ar putea genera o excepție. Acesta va fi urmat de tipul erorii sau tipurile erorilor ce pot fi generate și deasemenea se poate folosi în semnătura metodei main().
Exemplu în care s-a creat propria clasă de excepție. Excepția se va genera forțat atunci cînd utilizatorul va introduce un număr negativ:
public class Exemplul_3 {
public static void main(String [] args){
int nr;
Scanner in = new Scanner(System.in);
try{
nr = in.nextInt();
if (nr < 0) throw new MyExceptionPozitiv();
if (nr%2==0) System.out.println("Numar par !");
else System.out.println("Numar impar !");
}catch ( InputMismatchException ex){
System.out.println("Introduceti un numar intreg!!!");
} catch (MyExceptionPozitiv ex) {
System.out.println(ex);
} in.close();
}}
class MyExceptionPozitiv extends Exception{
MyExceptionPozitiv() {}
public String toString(){
return "Valoarea introdusa nu este pozitiva";
}
}
Sper că această postare vă este utilă.
Este binevenit orice comentariu!
Să aveți parte de o zi extraordinară !!!!!
Este binevenit orice comentariu!
Să aveți parte de o zi extraordinară !!!!!