Sunteți pe pagina 1din 9

Laborator 7:

Tratarea excepiilor n Java

ntocmit de: Adina Neculai


ndrumtor: Asist. Drd. Gabriel Danciu
13 noiembrie 2011

I.

NOIUNI TEORETICE
A.

Ce este o excepie?

O excepie este un eveniment care apare n execuia unui program i care ntrerupe evoluia
normal a acestuia.
ncercarea de a soluiona aceste excepii folosind metode clasice duce la creterea semnificativ
a complexitii codului, ceea ce afecteaz, n mod indirect, corectitudinea codului i claritatea
acestuia. De aceea, cei care au creat limbajul Java s-au gndit la un sistem de tratare a excepiilor
ce permite programatorului:
tratarea excepiilor la un nivel superior celui n care apar;
propagarea excepiilor la nivelele superioare n mod ierarhic;
tratarea unitar a excepiilor de acelai tip.

B.

Ierarhia excepiilor

Pentru a crea un obiect excepie, Java pune la dispoziia programatorului o ierarhie de clase,
aflat n pachetul java.lang, ierarhie ce poate fi observat n imaginea de mai jos.

Figura 1: Ierarhia simplificat a claselor de tip excepie din pachetul java.lang

Dup cum se poate observa din figura de mai sus, clasa Throwable are doi descendeni: clasa
Error i clasa Exception. Nici una nu adaug metode suplimentare, dar au fost introduse n acest
fel pentru a delimita dou tipuri fundamentale de excepii ce pot aprea ntr-o aplicaie Java.
Clasa Error corespunde excepiilor ce nu mai pot fi recuperate de ctre programator. Apariia
unei astfel de excepii nseamn c a aprut o eroare deosebit de grav i aceasta determin terminarea programului. Dei este datoria programatorului s arunce i s trateze excepiile aprute,
excepiile de tipul Error nu trebuie tratate n acest fel. Ele sunt utilizate de maina virtual Java
(JVM).
Clasa Exception este, de fapt, cea utilizat efectiv de programator n procesul de tratare a excepiilor. Att aceast clas ct i descendenii ei se ocup de excepii ce pot fi rezolvate de ctre
program, fr oprirea acestuia.
Exist o mare varietate de clase derivate din Exception care pot fi utilizate. Lista complet se
afl aici.

C.

Aruncarea unei excepii

Aruncarea unei excepii se face cu ajutorul cuvntului cheie throw n felul urmtor:
throw <obiectExceptie>

sau
throw new <clasaExceptie>(Mesaj)

unde <obiectExceptie> i new <clasaExceptie>(Mesaj) sunt instane ale clasei Throwable sau
ale unei clase derivate din aceasta.
O metod poate arunca mai multe excepii, ns prin aruncarea unei excepii se iese din metod
fr a mai executa instruciunile care urmau. n cazul n care o metod arunc o excepie, fie prin
throw, fie prin apelul unei alte metode, fr a avea o secven try - catch de prindere, atunci aceast
metod trebuie s specifice clar acest lucru.
public void <numeMetoda> throws <classException1>, <classException2>, . . . {
...
throw <obExceptie1>
...
throw <obExceptie2>

...
}

D.

Prinderea unei excepii

O dat ce o excepie a fost aruncat, ea trebuie prins. Acest lucru se poate realiza cu ajutorul
unui bloc try-catch, a crui form general este prezentat mai jos:
try{
//cod ce poate arunca o exceptie
}
catch(<classExcept1> <idExcept1>){
//handler exceptie de tip <classExcept1>
}
catch(<classExcept2> <idExcept2>){
//handler exceptie de tip <classExcept2>
}
...
finally{
//secventa de cod executata oricum
}

Dup cum se poate observa, structura de prinderere a excepiilor poate fi delimitat n trei blocuri:
try
Secvena de cod din acest bloc poate arunca, n anumite condiii, excepii. n cazul n care se
arunc o exepie, execuia secvenei din blocul try se ntrerupe i se declaneaz procedura
de tratare a excepiei. n caz contrar, secvena de cod din interiorul blocului se execut n
ntregime, controlul fiind predat primei instruciuni de dupa blocul try-catch.
catch
Numite i handlere de excepii, blocurile catch trateaz excepiile. n momentul n care
apare o excepie n blocul try, se parcurge lista blocurilor catch n ordinea n care apar n
codul surs. n cazul n care excepia corespunde unui bloc catch, se execut secvena de
4

cod care corespunde blocului respectiv i cutarea ia sfrit, considerndu-se c excepia a


fost rezolvat. Dup cum se poate observa, pot exista mai multe blocuri catch, acest lucru
subliniind faptul c se pot trata excepii de mai multe tipuri. Important este ca acestea s
fie introduse n ordinea copil - printe pentru c blocurile catch se parcurg secvenial.
finally
Blocul finally cuprinde secvena de cod care se execut n final, indiferent dac a aprut o
situaie de excepie sau nu.
Este obligatoriu ca blocul try s fie urmat de cel puin un bloc catch sau finally.

E.

Crearea propriilor excepii

n dezvoltarea unei aplicaii Java pot exista cazuri n care excepiile aprute s nu poat fi
tratate de clasele de excepie deja existente n pachetele Java (java.util, java.io, java.net). Astfel,
dezvoltatorii de aplicaii sunt nevoii s-i creeze propriile clase de excepie. Acest lucru se poate
realiza foarte uor i anume, crend clase care extind clasa Throwable sau clase descendente ale
acesteia. Se recomand, dintre subclasele lui Throwable, s se extind clasa Exception. Clasa Error
este specific erorilor grave, care duc la terminarea execuiei programului, i este puin probabil s
avem nevoie de ea.

II.
A.

PREZENTAREA LUCRRII DE LABORATOR

Exemple de programe ce demonstreaz lucrul cu excepiile

1. Programul urmtor conine funcia main() care apeleaz metoda metoda1() avnd ca parametru un numr ntreg. Funcia metoda1() va arunca o excepie n cazul n care parametru
trimis este diferit de 0, altfel funcia se va executa pn la capt. Observai ce se afieaz
pentru i=0 i pentru i=1; cnd se execut funcia metoda1() pn la capt i cnd nu. De
asemenea, observai i prezena blocului finally.
1 public c l a s s
2

TestExceptions1 {

public s t a t i c void main ( S t r i n g [ ]

for ( int

try {

i = 0;

i <= 1 ;

args ) {

i ++) {

System . o u t . p r i n t l n ( " \n Caz "+i ) ;

// a p a r i t i a

metoda1 ( i ) ;

exceptiei

se

realizeaza

prin

apelul

m e t o d e i metoda1

System . o u t . p r i n t l n ( " \n S f a r s i t c a z "+i ) ;

} catch ( E x c e p t i o n ex ) {

10

// t r a t a r e a

exceptiei

11

// a p e l a r e a

functiei

12

System . o u t . p r i n t l n ( "A a p a r u t o e x c e p t i e . M e s a j u l e i e s t e : "+ex . g e t M e s s a g e ( ) ) ;

13

intalnite

i n metoda1

getMessage ( ) a

clasei

Exception

} finally {

14

System . o u t . p r i n t l n ( " Se e x e c u t a b l o c u l f i n a l l y " ) ;

15

16

17

18
19

// metoda1

20

p r i v a t e s t a t i c void metoda1 ( i n t

specifica

prin

intermediul

cuvantului

cheie

21

System . o u t . p r i n t l n ( "Am i n t r a t i n metoda1 " ) ;

22

if

tipuri

de

exceptii

arunca

( i != 0 ) {

23

// a r u n c a r e a

24

throw new E x c e p t i o n ( " e x c e p t i e d i n metoda1 " ) ;

25

" throws " ce

i ) throws E x c e p t i o n {

exceptiei

de

tipul

Exception

26

System . o u t . p r i n t l n ( "Am i e s i t d i n metoda1 " ) ;

27

28 }

2. Acest program conine funcia main() care apeleaz funcia metoda1(), care, la rndul ei apeleaz funcia metoda2() ce poate arunca o excepie. Observai c ambele funcii (metoda1()
i metoda2()) specific ce tip de excepie arunc (Throwable). Dei blocul try-catch are mai
multe blocuri catch, excepia aprut este tratat de blocul corespunztor acesteia, adic
Throwable. Acest clas conine diverse metode care pot ajuta programatorul n localizarea
excepiei. Despre acestea putei citi aici.
1 public c l a s s
2

TestExceptions2 {

public s t a t i c void main ( S t r i n g [ ]

for ( int

try {

i = 0;

i <= 1 ;

args ) {

i ++) {

System . o u t . p r i n t l n ( " \n Caz " + i ) ;

metoda1 ( i ) ;

System . o u t . p r i n t l n ( " \n S f a r s i t c a z " + i ) ;

} catch ( E x c e p t i o n ex ) {

System . o u t

10

. p r i n t l n ( "A a p a r u t o e x c e p t i e E x c e p t i o n . M e s a j u l e i e s t e : "

11

+ ex . g e t M e s s a g e ( ) ) ;

12

} catch ( Throwable exTh ) {

13

System . o u t . p r i n t l n ( "A a p a r u t o e x c e p t i e Throwable i n main " ) ;

14

/ a p e l a r e a

metodei printStackTrace ( ) a

principiului
15

informatii

16

despre

clasei

Throwable c a r e

s t i v e LIFO ,

locatiile

p a r c u r s e de e x c e p t i e /

exTh . p r i n t S t a c k T r a c e ( System . o u t ) ;

17

} finally {

18

System . o u t . p r i n t l n ( " Se e x e c u t a b l o c u l f i n a l l y d i n main " ) ;

19

20
21

unei

}
}

afiseaza ,

conform

22
23

p r i v a t e s t a t i c void metoda1 ( i n t

i ) throws Throwable {

24

System . o u t . p r i n t l n ( "Am i n t r a t i n metoda1 " ) ;

25

metoda2 ( i ) ;

26

System . o u t . p r i n t l n ( "Am i e s i t d i n metoda1 " ) ;

27

28
29

p r i v a t e s t a t i c void metoda2 ( i n t

i ) throws Throwable {

30

System . o u t . p r i n t l n ( "Am i n t r a t i n metoda2 " ) ;

31

if

32

( i != 0 ) {
throw new Throwable ( " e x c e p t i e d i n metoda2 " ) ;

33

34

System . o u t . p r i n t l n ( "Am i e s i t d i n metoda2 " ) ;

35

36 }

3. Programul urmtor este unul didactic ntruct arunc clase de excepie descendente ale clasei
RuntimeException. Nu este obligatoriu ca acest gen de excepii s fie prinse (tratate), dar
exemplul a fost introdus pentru o mai bun nelegere a mecanismului de aruncare/prindere
a excepiilor.
Dup cum se poate observa la o prim rulare a programului, va fi prins prima excepie,
NumberFormatException. Comentai, respectiv decomentai, secvene de cod din program,
astfel nct s obinei, pe rnd, toate excepiile tratate.
De asemenea, programul conine o metod callException() ce primete ca parametru un tip
de dat excepie. Aceasta apeleaz cteva dintre metodele implementate de clasele de tip
excepie. Metodele respective au rolul de a oferi mai multe informaii despre locaia i tipul
de excepie aprut.
1 public c l a s s
2
3

TestExceptions3 {

public s t a t i c void main ( S t r i n g [ ]

args ) {

try {

System . o u t . p r i n t l n ( " \nNumber Format E x c e p t i o n " ) ;

String

Integer n = Integer . parseInt ( str1 ) ;

s t r 1 = " 123 r " ;

7
8

System . o u t . p r i n t l n ( " \n A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n " ) ;

int

10

s i r [ ] = { 1 , 2 , 3 , 4 };

s i r [ 6 ] = 3;

11
12

System . o u t . p r i n t l n ( " \n S t r i n g I n d e x O u t O f B o u n d s E x c e p t i o n " ) ;

13

String

14

char c 1 = s t r 2 . c h a r A t ( 1) ;

s t r 2 = " abcde " ;

15
16

System . o u t . p r i n t l n ( " \n N u l l P o i n t e r E x c e p t i o n " ) ;

17

String

18

System . o u t . p r i n t l n ( s t r 3 . l e n g t h ( ) ) ;

s t r 3 = null ;

19
20

System . o u t . p r i n t l n ( " \n A r i t h m e t i c E x c e p t i o n " ) ;

21

i n t n2 = 1 2 / 0 ;

22
23

} catch ( NumberFormatException n f e x ) {

24

System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e NumberFormatException . . . " ) ;

25

callException ( nfex ) ;

26

} catch ( A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n a r r a y E x ) {

27

System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n . . . " ) ;

28

c a l l E x c e p t i o n ( arrayEx ) ;

29

} catch ( S t r i n g I n d e x O u t O f B o u n d s E x c e p t i o n s t r E x ) {

30

System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e S t r i n g I n d e x O u t O f B o u n d s E x c e p t i o n . . . " ) ;

31

c a l l E x c e p t i o n ( strEx ) ; ;

32

} catch ( N u l l P o i n t e r E x c e p t i o n

33

nullEx ) {

System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e N u l l P o i n t e r E x c e p t i o n . . . " ) ;

34

c a l l E x c e p t i o n ( nullEx ) ;

35

} catch ( A r i t h m e t i c E x c e p t i o n aEx ) {

36

System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e A r i t h m e t i c E x c e p t i o n . . . " ) ;

37

c a l l E x c e p t i o n ( aEx ) ;

38

39

40
41

p r i v a t e s t a t i c void c a l l E x c e p t i o n ( R u n t i m e E x c e p t i o n r t e x ) {

42

System . o u t . p r i n t l n ( " M e s a j u l s t a n d a r d a l e x c e p t i e i : " ) ;

43

System . o u t . p r i n t l n ( r t e x ) ;

44

System . o u t . p r i n t l n ( " M e s a j u l e x c e p t i e i : " ) ;

45

System . o u t . p r i n t l n ( r t e x . g e t M e s s a g e ( ) ) ;

46

System . o u t . p r i n t l n ( " M e s a j u l l o c a l : " ) ;

47

System . o u t . p r i n t l n ( r t e x . g e t L o c a l i z e d M e s s a g e ( ) ) ;

48

System . o u t . p r i n t l n ( " \ n S t a c k t r a c e : " ) ;

49

r t e x . p r i n t S t a c k T r a c e ( System . o u t ) ;

50

51 }

B.

Crearea propriilor excepii

Crearea propriilor excepii se face prind crearea unei clase obinuite, dar care motenete clasa
Exception. Clasa urmtoare face exact acest lucru. IncompatibleMatrixException conine doi constructori, unul fr parametri i unul cu un parametru i care apeleaz constructorul clasei de
baz.
1 public c l a s s

I n c o m p a t i b l e M a t r i x E x c e p t i o n extends E x c e p t i o n {

2
3

public I n c o m p a t i b l e M a t r i x E x c e p t i o n ( ) {

5
6

public I n c o m p a t i b l e M a t r i x E x c e p t i o n ( S t r i n g m e s s a g e ) {

super ( m e s s a g e ) ;

9 }

Clasa prezentata mai jos, declar dou matrici de dimensiuni diferite i se ncearc nmulirea
acestora. Metoda multiplyMatr() este apelat n cadrul unui bloc try i verific dac dou matrici
8

sunt compatibile. n cazul n care numrul de coloane ale primei matrici este diferit de numrul de
linii ale celei de-a doua, atunci se arunc excepia creat anterior, IncompatibleMatrixException.
1 public c l a s s
2

TestMatrixException {

public s t a t i c void main ( S t r i n g [ ]

int [ ] [ ]

matr1 ,

matr1 = new i n t [ 2 ] [ 3 ] ;

matr2 = new i n t [ 4 ] [ 4 ] ;

args ) {

matr2 ;

6
7

try {

m u l t i p l y M a t r ( matr1 ,

matr2 ) ;

} catch ( I n c o m p a t i b l e M a t r i x E x c e p t i o n imEx ) {

10

System . o u t . p r i n t l n ( " M e s a j u l e s t e : "+imEx . g e t M e s s a g e ( ) ) ;

11

imEx . p r i n t S t a c k T r a c e ( System . o u t ) ;

12
13

}
}

14
15

p r i v a t e s t a t i c void m u l t i p l y M a t r ( i n t [ ] [ ]

16

if

17

int [ ] [ ]

matr2 ) throws I n c o m p a t i b l e M a t r i x E x c e p t i o n {

throw new I n c o m p a t i b l e M a t r i x E x c e p t i o n ( " m a t r i c i i n c o m p a t i b i l e p t i n m u l t i r e " ) ;

18

19
20

matr1 ,

( matr1 [ 0 ] . l e n g t h != matr2 . l e n g t h ) {

// cod d e s t i n a t

pt

inmultirea

matricilor

21
22 }

III.

TEM

1. Rulai toate programele prezentate ca exemplu n seciunea II.


2. Realizai un program n care s se testeze captarea i tratarea excepiilor generate la calcularea a cel puin 10 funcii matematice din clasa Math aflat n pachetul java.lang. Folosii
blocuri de catch specifice pentru fiecare funcie n parte.