Manipularea exceptiilor - Utilizarea exceptiilor



Manipularea exceptiilor Utilizarea exceptiilor



Utilizarea exceptiilor


O exceptie este o situatie speciala aparuta in timpul executiei programului, care cere fie stoparea rularii si iesirea din program, fie executia unui set de linii special concepute pentru a trata situatia respectiva.



Marea majoritate a exceptiilor sunt de fapt erori aparute in cursul rularii programului, spre exemplu, impartirea unui intreg cu 0. La inta lnirea unei asemenea situatii, calculatorul semnalizeaza eroarea si programul executa un salt la manipulatorul de exceptii potrivit care receptioneaza mesajul si executa tratamentul acestei exceptii. In cazul in care, in programul respectiv, nu s-a prevazut un manipulator de exceptii pentru situatia semnalata, intra in functiune manipulatorul predefinit de limbajul Java si dupa afisarea unui mesaj de eroare la linia de comanda, se opreste executia programului.

Exceptiile nu trebuiesc considerate insa unul si acelasi lucru cu erorile, desi cel mai adesea reprezinta conditii de eroare. O exceptie poate sa semnalizeze aparitia unei situatii nedorite de programator in cursul executiei unui program.

Asa cum se va arata in cursul acestui capitol, se pot defini de catre cel ce construieste un program, exceptii proprii, care se comporta similar cu cele predefinite in cadrul limbajului si care, corespund necesitatilor de evitare a unor cazuri defavorabile de executie a programului.

T.10.1.1. Precizati care dintre situatiile de exceptie de mai jos trebuie tratate ca erori si determina iesirea din program:

a)     Terminarea cu “break” a unui ciclu for;

b)     Depasirea dimensiunii declarate initial a ariei;

c)      Instantiere obiect al unei clase abstracte.

La fel ca majoritatea lucrurilor in limbajul Java, exceptiile sunt tipuri de obiecte. Marea lor majoritate sunt subclase ale claselor:

Exception;

RuntimeException;

Error.

care la randul lor sunt derivate din clasa de baza Throwable. Acest fapt este rezultatul evolutiei limbajului de la fazele de testare alfa si beta la situatia actuala. Clasa Error, de exemplu, a fost inclusa ulterior in pachetul java.lang si a fost deja amintita atunci cand s-a facut prezentarea acestuia.

In cele ce urmeaza se va face o trecere in revista a claselor de exceptii predefinite de varianta actuala a limbajului Java.

Subclasele derivate din clasa Exception sunt:

ClassNotFoundException, clasa nu a fost gasita;

DataFormatException, format incorect al datelor din fluxul IN;

IllegalAccessException, instantiere dintr-o clasa inaccesibila;

InstantiationException, instantiere obiect al unei clase abstracte;

InteruptedException, intreruperea unui fir de executie;

NoSuchMethodException, metoda inexistenta sau inaccesibila.

Subclasele de exceptii ale clasei Error sunt:

ClassCircularityError, eroare de circularitate;

ClassFormatError, format eronat

IllegalAccesError, acces nepermis

IncompatibleClassChangeError, schimbare clase incompatibile;

InstantiationError, eroare la instantiere.

In sfarsit, subclasele de exceptii ale clasei RuntimeException sunt:

ArithmeticException, divizare a unui intreg cu 0;

ArrayIndexOutOfBoundsException, depasirea dimensiunii declarate initial a ariei;

ArrayStoreException, incompatibilitate intre formate element-tablou;

ClassCastException, operatiune de “cast” eronata;

IllegalArgumentException, parametru incorect;

IllegalThreadStateException, manipulare gresita a unui fir de executie (Thread

IndexOutOfBoundsException index afara din tablou;

NegativeArraySizeException, dimensiune negativa tablou;

NullPointerException, accesare obiect sau metoda inexistenta;

NumberFormatException, conversie sir-numar incorecta;

SecurityException, incalcare a regulilor de securitate ale sistemului

StringIndexOutOfBoundsException, index afara din sir.

T.10.1.2. Care sunt clasele de exceptii corespunzatore situatiilor descrise la T.10.1.1:

Utilizarea claselor de exceptii din lista de mai sus se face in cazul in care, in faza de conceptie a programelor, se apreciaza ca situatiile speciale corespunzatoare lor ar putea sa apara in timpul rularii.

T.10.1.2. Raspundeti la urmatoarele intrebari

1. In limbajul Java sunt considerate exceptii:

a)              Orice eveniment;

b)             Situatiile speciale;

c)              Erorile.

2. Exceptiile utilizate in Java sunt obiecte ale subclaselor:

a)              Exception;

b)             RunException;

c)              RuntimeError;

3. Divizarea unui intreg cu 0 produce o exceptie din clasa:

a)              IllegalArgumentException

b)             ArithmeticException

c)              NullPointerException

4. Instantierea unui obiect intr-un program poate duce la:

a)              Crearea obiectului respectiv;

b)             InstantiationException;

c)              ClassNotFoundException.

5. O exceptie este utilizata daca:

a)              Se doreste aparitia unei situatii speciale in program;

b)             Exista riscul sa apara o situatie speciala in program;

c)              Este ceruta de cartea tehnica a calculatorului.


10.2. Instructiuni de manipulare a exceptiilor


Tratarea exceptiilor se face cu ajutorul unor instructiuni specifice ale limbajului Java, denumite manipulatoare de exceptii (eng. exceptions handlers). Asemenea manipulatoare sunt prezente in toate limbajele obiectuale moderne.

Cele mai utilizate instructiuni de manipulare Java sunt “try catch” (incerca prinde). Sintaxa unui asemenea bloc de testare a aparitiei unei exceptii este:

trycatch(tip_exceptie nume_exceptie)

De exemplu o impartire cu zero se poate manipula in interiorul programului astfel:

trycatch(ArithmeticException e)

System.out.print(“Operatie corecta.”);

T.10.2.1. Scrieti liniile de program care sa manipuleze o exceptie rezultata din depasirea dimensiunii maxime a unui tabel.

Pentru o singura instructiune try, pot exista mai multe instructiuni catch, asa cum se poate observa in exemplul urmator unde programatorul a prevazut posibilitatea de aparitie si tratare a mai multor tipuri de erori:

trycatch(ArithmeticException e) catch(Exception e1)

System.out.print(“Operatie corecta”);

T.10.2.2. Modificati secventa de la T.10.2.1. astfel incat sa testeze urmatoarele posibile tipuri de exceptii:

a)     ArrayIndexOutOfBorderException;

b)     NegativeArraySizeException;

c)      IndexOutOfBoundsException.

Urmarea aparitiei unei exceptii calculatorul incearca sa gaseasca tipul exceptiei printre blocurile “catch” existente. Cautarea se face urmarind regulile de mai jos:

Clauza “catch” trebuie sa se potriveasca cu exceptia tratata

Clauza “catch” trebuie sa se potriveasca cu superclasa exceptiei

Clauza “catch” trebuie sa constituie o interfata implementata de exceptie

O exceptie noua se defineste ca o clasa oarecare si se declara pe post de exceptie cu instructiunea “throw” avand sintaxa:

class Nume_exceptie


throw new Nume_exceptie


Apoi ea se poate utiliza ca orice alt tip de exceptii predefinit:

trycatch(Exception Nume_exceptie)

In examplul de mai jos este ilustrata creerea si utilizarea unei clase de exceptii.

class O_exceptie


try catch(ArithmeticException e)catch(Exception O_exceptie) catch(Exception e1)

System.out.print(“Operatie corecta”);

T.10.2.3. Scrieti liniile de program care sa creeze o clasa de exceptie Ex, care sa reactioneze la situatia in care variabila alfa devine nula. Scrieti in continuare blocul de test “try…catch” pentru acest tip de exceptie.

Declararea unei clase ca fiind exceptie cu instructiunea “throw” se poate face si in orice punct din interiorul blocului try rezultand o returnare a controlului la nivelul instructiunii try indiferent ce alte comenzi contine blocul respectiv.

Pentru a asigura executia obligatorie in program a unui bloc de instructiuni indiferent de aparitia sau nu a unor exceptii se foloseste instructiunea finally

trycatch(Exception Nume_exceptie)finally

Finally se executa indiferent de situatie chiar daca in cadrul blocului try apare o instructiune break, continue return sau throw.

trycatch(ArithmeticException e)finally

System.out.print(“Operatie corecta”);

T.10.2.4. Modificati blocul de program scris la T.10.2.2. astfel incat, conform modelului din exemplul anterior, sa se utilizeze instructiunea “finally”.

Cand o metoda nu contine manipulatoare de exceptii acestea sunt semnalate apelantului acelei metode, pentru ca acesta sa le trateze.

Prin urmare, o metoda poate sa fie definita din start ca fiind transmitatoarea unor posibile exceptii, acest lucru asigurand posibilitatea plasarii manipulatoarelor de eroare in exteriorul ei.

Declararea metodei se face cu instructiunea “throws”:

tipul_valorii_returnate nume_met(parametrii) throws nume_ex

Adica, de exemplu:

void o_metoda() throws InteruptException

T.10.2.5. Declarati o metoda void m(int a) care sa atentioneze apelantul asupra posibilei aparitii a unei exceptii din clasa ClassNotFoundException.

Utilizarea acestei metodologii de tratare a erorilor are avantaje si dezavantaje functie de situatia concreta din program. Daca, de exemplu, mai multe metode returneaza aceiasi eroare si sunt utilizate de acelasi apelant, acest mod de lucru este cel optim.

T.10.2.6. Raspundeti la urmatoarele intrebari

1. Un bloc de testare a aparitiei unei exceptii contine obligatoriu:

a)     instructiune “if”;

b)     instructiune “try”;

c)      instructiune “finally”.

2. Limbajul Java permite scrierea de:

a)     Clase de erori proprii;

b)     Clase de exceptii proprii;

c)      Blocuri de testare multiple.

3. O clasa proprie de exceptii se declara:

a)     Cu sintaxa valabila pentru orice clasa;

b)     In interiorul unui bloc “try…catch”;

c)      Nu se declara.

4. Un bloc de testare “try… catch” care cerceteaza aparitia mai multor tipuri de erori cuprinde:

a)     singura instructiune “try”;

b)     Cate o instructiune “catch” pentru fiecare eroare;

c)      instructiune “finally”.

5. O metoda a carei actiune este susceptibila de a produce exceptii trebuie sa fie:

a)     Eliminata din start;

b)     Modificata pentru a elimina orice risc;

c)      Declarata ca fiind susceptibila sa faca acest lucru.


Concluzii


O exceptie este o situatie speciala aparuta in timpul executiei programului, care cere fie stoparea rularii si iesirea din program, fie executia unui set de linii special concepute pentru a trata situatia respectiva.

O exceptie nu este neaparat o eroare, ea poate sa semnalizeze aparitia unei situatii nedorite de programator in cursul executiei unui program. Se pot defini de catre programator, exceptii proprii care se comporta similar cu cele predefinite in cadrul limbajului si care corespund necesitatilor de evitare a unor cazuri defavorabile.

Tratarea exceptiilor se face cu ajutorul unor instructiuni specifice ale limbajului denumite manipulatoare de exceptii. Cel mai utilizat mod de manipulare ale exceptiilor in Java sunt blocurile “try catch”.


Raspunsuri


T.10.1.1.

a)          Nu

b)          Da

c)           Da

T.10.1.2.

a)         

b)          ArrayOutOfBoundsException;

c)           InstantiationException;

T.10.1.3.1. b, c

T.10.1.3.2. a

T.10.1.3.3. b

T.10.1.3.4. a, b

T.10.1.3.5. b

T.10.2.1.

trycatch(ArrayIndexOutOfBorderException e)

System.out.print(“Operatie corecta”);

T.10.2.2.

trycatch(ArrayIndexOutOfBorderException e1) catch(NegativeArraySizeException e2)

} catch(IndexOutOfBoundsException e3)

System.out.print(“Operatie corecta”);

T.10.2.3.

class Ex


try catch(Ex e)

System.out.print(“Operatie corecta”);

T.10.2.4.

trycatch(ArrayIndexOutOfBorderException e1) catch(NegativeArraySizeException e2)

} catch(IndexOutOfBoundsException e3)

} finaly

System.out.print(“Operatie corecta”);

T.10.2.5.

void m(int a) throws ClassNotFoundException

T.10.2.6.1. b

T.10.2.6.2. a, b, c

T.10.2.6.3. a, b

T.10.2.6.4. a, b, c

T.10.2.6.5.

T.10.3.1. Rezultatul rularii programului “Stea” in mediul Microsoft Development Studio for Java utilizand ca browser navigatorul Internet Explorer incorporat in Windows 98 este prezentat in Figura 10.3.