Sunteți pe pagina 1din 15

Probleme n cursul execuiei

Un program ntlnete adesea probleme n cursul execuiei


sale:


Programare orientat pe obiecte




1. Erori i excepii n Java

Excepiile i erorile Java permit programatorului s trateze


astfel de probleme.





20.04.2006

OOP8 - M. Joldo - T.U. Cluj

poate avea probleme la citirea datelor,


pot exista caractere nepermise n date sau
indexul unui tablou poate depi limitele acestuia.

Putem scrie programe care i revin la ntlnirea erorilor i i


continu execuia.

Programele nu trebuie s eueze atunci cnd utilizatorul face o


greeal!

n special intrarea i ieirea sunt susceptibile la erori.


Tratarea excepiilor este esenial pentru programarea I/E

20.04.2006

Exemplu de apariie a unei excepii




Discuie asupra exemplului

Programul:

import java.util.Scanner;
public class InputMismatchExceptionDemo {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.print("Enter one integer:");
int inputNumber = keyboard.nextInt();
System.out.println("The square of " + inputNumber + " is " +
inputNumber * inputNumber);
}
}


OOP8 - M. Joldo - T.U. Cluj

Cu intrarea: Enter
D rezultatul:

Programul nu este greit.




one integer:h1

java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:819)
at java.util.Scanner.next(Scanner.java:1431)
at java.util.Scanner.nextInt(Scanner.java:2040)
at java.util.Scanner.nextInt(Scanner.java:2000)
at InputMismatchExceptionDemo.main(InputMismatchExceptionDemo.java:11)
20.04.2006

OOP8 - M. Joldo - T.U. Cluj

Problema este c nextInt nu poate converti


irul de caractere "h1" la un int.
n momentul n care nextInt a ntlnit
problema, metoda a aruncat o excepie de tipul
InputMismatchException.
Sistemul de execuie Java a interceptat (a
"prins") excepia, a oprit programul i a tiprit
mesajele de eroare

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

Excepii i erori


O excepie: o problem care apare n cursul


execuiei unui program.





Ierarhia Throwable ("aruncabil")

La apariia unei excepii, JVM creeaz un obiect de clasa


Exception care conine informaii despre problema
aprut.
nsui programul Java poate intercepta (catch) o
excepie. Apoi poate folosi obiectul de tipul excepie
pentru ai reveni dup problem.

i o eroare este o problem care apare la rularea


unui program.
O eroare este reprezentat de un obiect de clasa
Error.


Att clasa Exception ct i clasa


Error descind din Throwable.

OOP8 - M. Joldo - T.U. Cluj

Excepii != Erori: se pot scrie


programele astfel nct s-i
revin dup excepii, dar nu se
pot scrie astfel nct s-i revin
dup erori

D.e. Integer.parseInt("zzz") arunc o


excepie atunci cnd ncearc s
converteasc "zzz" ntr-un ntreg.

Dar o eroare este prea sever pentru a fi tratat de un


program. Programul trebuie s-i nceteze execuia.

20.04.2006

O metod Java poate "arunca" un


obiect de clasa Throwable.

20.04.2006

Software de bibliotec Java (sau codul definit


de ctre programator) furnizeaz un mecanism
care semnalizeaz cnd se ntmpl ceva

Calea fundamental pentru tratarea excepiilor n Java


const din trio-ul try-throw-catch
Blocul try conine codul pentru algoritmul
implementat


neobinuit


Aceasta se numete aruncarea unei excepii




n alt loc din program, programatorul trebuie


s scrie cod care trateaz cazul excepional
 Aceasta se numete tratarea excepiei

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

Mechanismul try-throw-catch

Introducere n tratarea excepiilor




OOP8 - M. Joldo - T.U. Cluj

Acest cod spune ce se face atunci cnd totul merge


nur
Se numete bloc try deoarece el "ncearc" s execute cazul
n care totul merge aa cum a fost planificat

De asemenea acest bloc poate conine cod care arunc


o excepie dac se ntmpl ceva neobinuit
try {
CodCarePoateAruncaOExceptie
}

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

Mechanismul try-throw-catch

Mechanismul try-throw-catch

throw new
NumeleClaseiExceptie(PosibilArgumente);


La aruncarea unei excepii, execuia blocului try n


care a fost aruncat excepia se oprete

O instruciune throw seamn cu un apel de


metod:
throw new NumeClasaExceptie(UnString);


Normal, controlul este transferat unei alte poriuni de cod,


blocul catch (blocul de interceptare)

Valoarea aruncat este argumentul operatorului


throw; ea este ntotdeauna un obiect aparinnd
unei clase excepie

Execuia unei instruciuni throw se numete aruncare a

n exemplul de mai sus, obiectul de clasa


NumeClasaExceptie este creat folosind ca argument
un ir de caractere
Acest obiect, care este argument pentru operatorul
throw, este obiectul excepie aruncat

n loc s apeleze o metod, instruciunea throw


apeleaz un bloc catch

unei excepii
20.04.2006

OOP8 - M. Joldo - T.U. Cluj

20.04.2006

Mechanismul try-throw-catch


catch(Exception e) {
CodDeTratareAExceptiei
}

Obiectul excepie aruncat este transmis ca parametru al


blocului catch

Execuia blocului catch se numete


interceptarea/"prinderea" excepiei, sau tratarea

Ori de cte ori se arunc o excepie, ea trebuie pn la


urm tratat (interceptat "prins") de un bloc

Un bloc catch arat ca o definiie de metod care


are un parametru de tipul clasei Exception


excepiei


Dar nu este, totui, o definiie de metod

Un bloc catch este o poriune de cod separat


care se execut atunci cnd un program ntlnete
i execut o instruciune throw n blocul try
precedent
 Un bloc catch este numit adesea bloc de tratare a
excepiei

catch


20.04.2006

10

Mechanismul try-throw-catch

La aruncarea unei excepii se ncepe executarea


blocului catch
 Blocul catch are un parametru


OOP8 - M. Joldo - T.U. Cluj

OOP8 - M. Joldo - T.U. Cluj

11

El poate avea cel mult un parametru

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

12

Mechanismul try-throw-catch

Mechanismul try-throw-catch

catch(Exception e) { . . . }



Identificatorul e din blocul catch de deasupra se


numete parametru al blocului catch
Parametrul blocului catch ndeplinete dou
roluri:
1. Specific tipul de obiect excepie aruncat pe care blocul
catch l poate intercepta (d.e., mai sus este un obiect
de clasa Exception)
2. Ofer un nume (pentru obiectul care este interceptat)
care s fie folosit n blocul catch
Observaie: adesea se folosete identificatorul e prin
convenie, dar se poate folosi orice identificator care
nu este cuvnt cheie

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

13

La executarea unui bloc try se pot ntmpla


dou lucruri:
1. Nu este aruncat nici o excepie n blocul
try

20.04.2006

Mechanismul try-throw-catch

Codul din blocul try este executat pn la


sfritul blocului
Blocul catch este srit
Execuia continu de la codul amplasat dup
blocul catch
OOP8 - M. Joldo - T.U. Cluj

14

Mechanismul try-throw-catch

2. Este aruncat o excepie n blocul try i


interceptat n blocul catch

20.04.2006

Restul codului din blocul try este srit


Controlul se transfer la un bloc catch urmtor (n
cazurile simple)
Obiectul aruncat este transmis ca parametru al
blocului catch
Se execut codul din blocul catch
Se execut codul care urmeaz dup blocul catch
respectiv (dac exist)
OOP8 - M. Joldo - T.U. Cluj

15

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

16

Mechanismul try-throw-catch

Exemplu cu dou excepii




public class DoublaGreseala {


public static void main(String[] args) {
int num = 5, denom = 0, result;
int[] arr = {7, 21, 31};
Observaie. Cea de a
try
doua excepie nu va fi
{
aruncat niciodat.
result = num / denom;
De ce?
result = arr[num];
}
catch (ArithmeticException ex) {
System.out.println(Eroare aritmetica");
}
catch (IndexOutOfBoundsException ex) {
System.out.println(Eroare de indice");
}
}
}
20.04.2006

OOP8 - M. Joldo - T.U. Cluj




17

La aruncarea unei excepii de ctre o instruciune blocul try{}


try{},
{}
blocurile catch{} sunt examinate unul cte unul ncepnd cu
primul.
Un singur bloc catch{} este ales.
Dac nici un bloc catch{} nu se potrivete cu excepia, atunci
nu este ales nici unul, iar execuia prsete metoda
respectiv (exact ca n lipsa blocului catch{}.)
catch{}
Primul bloc catch{} care se potrivete cu tipul de excepie
aruncat obine controlul.
Cele mai specifice tipuri de excepie trebuie s apar la
nceput, urmate de tipurile mai generale de excepie.
Instruciunile din blocul catch{} ales sunt executate secvenial.
Dup executarea ultimei instruciuni, controlul ajunge la prima
instruciune care urmeaz dup structura try/catch
try/catch.
/catch
Controlul nu se ntoarce n blocul try.
try

20.04.2006

try
{
num
= Integer.
Integer.parseInt(
parseInt( inData
);
inputOK = true;
true;
}
catch (NumberFormatException
(NumberFormatException ex )
{
System.
System.out.
out.println(
println(Ati
(Ati introdus
date invalide."
invalide." );
System.
System.out.
out.println(
println(Va
(Va rog sa
reincercati.
reincercati.\n" );
}

public class SquareUser


{
public static void main ( String[]
String[] a ) throws
IOException
{
BufferedReader stdin =
new BufferedReader ( new
InputStreamReader(
InputStreamReader( System.in
System.in ) );
String inData = null;
null;
int
num = 0;
}
boolean inputOK = false;
System.
System.out.
out.println(
println(Patratul
(Patratul lui " +
while ( !inputOK
!inputOK )
inData + " este " + num*
num*num );
{
}
System.
System.out.
out.print(
print(Introduceti
(Introduceti un
}
intreg:");
intreg:");
inData = stdin.
stdin.readLine();
readLine();
20.04.2006

OOP8 - M. Joldo - T.U. Cluj

18

Clauza finally

Exemplu de intrare "prietenoas"


import java.
java.lang
lang.*
lang.* ;
import java.io.* ;

OOP8 - M. Joldo - T.U. Cluj





Scanner in = new Scanner(reader);


readData(in);
reader.close();
// s-ar putea sa nu ajunga aici
// niciodata


19

Excepia provoac terminarea metodei curente


Pericol: se poate sri peste o poriune de cod esenial
Exemplu: reader = new FileReader(filename);

Trebuie executat reader.close() chiar dac apare o


excepie
Folosim clauza finally pentru codul care trebuie
executat "indiferent de ce se ntmpl" (necondiionat)

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

20

Clauza finally

Clauza finally


Executat la ieirea din blocul try:




Exemplu BlueJ

(ExceptFinallyEx)


20.04.2006

OOP8 - M. Joldo - T.U. Cluj

21

Dup ultima instruciune din blocul try


Dup ultima instruciune din blocul catch,
dac n acest bloc try a aprut o excepie
La aruncarea unei excepii n blocul try,
excepie care nu a fost interceptat

Cay Horstmann recomand: nu amestecai


clauzele catch i finally n acelai bloc
try

20.04.2006

Blocuri catch multiple i clauza


finally


try {
// Bloc de cod cu puncte de iesire multiple
}
catch (OneException e) {
System.out.println(Am interceptat OneException!");
}
catch (OtherException e) {
System.out.println(" Am interceptat OtherException!");
}
catch (AnotherException e) {
System.out.println(" Am interceptat AnotherException!");
}
finally {
// Bloc de cod executat intotdeauna la iesirea din blocul,
// indiferent de cum s-a iesit din try.
System.out.println("Finally este executat intotdeauna");
}

Exist mai multe clase excepie pe lng clasa


Exception


23

Exist mai multe clase excepie n bibliotecile standard


Java
Pot fi definite noi clase excepie exact ca orice alte clase

Toate clasele excepie predefinite au urmtoarele


proprieti:



OOP8 - M. Joldo - T.U. Cluj

22

Clase excepie

Dac exist clauze catch asociate blocului try, atunci trebuie s


punem clauza finally dup toate clauzele catch. Exemplu:

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

Posed un constructor cu un singur argument de tipul


String
Clasa are o metoda accesoare, getMessage(), care
poate recupera irul dat ca argument constructorului la
crearea obiectului excepie

Toate clasele definite de programator ar trebui s aib


aceleai proprieti

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

24

Folosirea metodei getMessage

Clase excepie din pachetele standard




Exist numeroase clase excepie predefinite care sunt


incluse n pachetele standard livrate cu Java. Spre
exemplu:
IOException
NoSuchMethodException
FileNotFoundException


Multe clase excepie trebuie importate pentru a le putea utiliza.


Exemplu:
import java.io.IOException;

Clasa predefinit Exception este clasa rdcin pentru


toate excepiile



Fiecare clas excepie este descendent din clasa Exception


Dei clasa Exception poate fi folosit: direct sau pentru a defini o
clas derivat
Se afl n pachetul java.lang i, nu trebuie clauz import

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

25

. . . // codul metodei
try
{
. . .
throw new
Exception(StringArgument);
. . .
}
catch(Exception e)
{
String message =
e.getMessage();
System.out.println(message);
System.exit(0);
} . . .

20.04.2006

Definirea claselor excepie




programator

Acest ir identific de obicei


motivul apariiei excepiei

StringArgument este
folosit ca valoare pentru
variabila instan de tip ir
a excepiei e


De aceea, apelul de metod


e.getMessage()
returneaz acest ir

OOP8 - M. Joldo - T.U. Cluj

26

27

derivat din oricare clas excepie definit n bibliotecile standard


Java sau definit de ctre programator

Constructorii sunt membrii cei mai importani n definirea


unei clase excepie

Putem defini un tip de excepie diferit pentru a


identifica fiecare situaie excepional

OOP8 - M. Joldo - T.U. Cluj

Fiecare clas excepie care urmeaz s fie definit trebuie


s fie o clas derivat dintr-o clas excepie deja definit


Acestea pot fi croite astfel nct s conin exact


tipurile de informaie necesare n blocul catch

20.04.2006

Fiecare excepie are o


variabil instan de tipul
String care conine un
mesaj

Definirea claselor excepie

O instruciune throw poate arunca un


obiect excepie de oricare clas excepie
Clasele excepie pot fi i definite de ctre


Constructorii trebuie s se comporte corespunztor n raport cu


variabilele i metodele motenite din clasa de baz
Adesea, nu exist ali membri cu excepia celor motenii din clasa
de baz

Clasa care urmeaz nu efectueaz dect aceste sarcini


fundamentale

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

28

O clas excepie definit de ctre


programator

Caracteristicile obiectului Exception

public class DivisionByZeroException extends Exception


{
public DivisionByZeroException()
Se poate face mai mult
{
ntr-un constructor de
super("Division by zero.");
excepie, dar aceasta
este o form uzual.
}
public DivisionByZeroException(String message)
{
super invoc
super(message);
constructorul clasei de
baz Exception
}
}
20.04.2006

OOP8 - M. Joldo - T.U. Cluj

Cele mai importante dou lucruri referitoare


la un obiect excepie sunt tipul su (adic,
clasa excepie) i mesajul pe care l poart


29

Mesajul este transmis mpreun cu obiectul


excepie ca variabil instan
Acest mesaj poate fi recuperat cu metoda
accesoare getMessage, astfel c blocul catch
poate folosi mesajul

20.04.2006

Indicaii pentru clasele excepie definite


de programator


Clasele excepie pot fi definite de ctre


programator, dar fiecare asemenea clas trebuie
s fie derivat dintr-o clas excepie existent deja
Clasa Exception poate fi folosit pe post de
clas de baz, cu excepia cazului n care o alt
clas excepie este mai potrivit
Trebuie definii cel puin doi constructori, iar
uneori mai muli
Excepia trebuie s in seama c metoda
getMessage() este motenit

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

31

OOP8 - M. Joldo - T.U. Cluj

30

S pstreze getMessage


Pentru toate clasele excepie predefinite,


getMessage returneaz irul de caractere transmis
ca argument constructorului su


Sau s returneze un ir implicit dac nu s-a transmis nici


un argument constructorului

Acest comportament trebuie pstrat n toate clasele


excepie definite de ctre programator
 Trebuie inclus un constructor care are un parametru ir

de caractere i al crui corp ncepe cu un apel la


super. Apelul la super trebuie s foloseasc
parametrul ca argument al su
Trebuie inclus i un constructor fr argumente al crui
corp ncepe cu un apel la super. Acest apel la super
trebuie s foloseasc irul implicit ca argument

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

32

Capcan: Interceptai mai nti cea mai


specific excepie

Blocuri catch multiple




Un bloc try poate arunca potenial orice numr de


valori excepie, iar acestea pot fi de tipuri diferite


n oricare execuie a unui bloc try, poate fi aruncat


cel mult o excepie (de vreme ce instruciunea throw
termin execuia blocului try)
La execuii diferite ale blocului try pot fi aruncate valori
diferite

Fiecare bloc catch poate intercepta valorile de tipul


de clas excepie date n antetul blocului catch
Se pot intercepta tipuri diferite de excepii punnd mai
multe blocuri catch dup un bloc try


Se pot pune oricte blocuri catch, dar n ordinea


corect

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

La interceptarea de excepii multiple, ordinea blocurilor catch este


important


catch (Exception e)
{ . . . }
catch (NegativeNumberException e)
{ . . . }
Deoarece NegativeNumberException este un tip de Exception,
toate NegativeNumberExceptions vor fi interceptate de ctre
primul bloc catch nainte de a ajunge vreodat la cel de-al doilea


33

La aruncarea unei excepii ntr-un bloc try, blocurile catch sunt


examinate n ordinea apariiei
Este executat primul bloc care se potrivete cu tipul de excepie
aruncat

Blocul catch pentru NegativeNumberException nu va fi folosit!

Pentru ordine corect, inversai cele dou blocuri

20.04.2006

Uneori are sens s se arunce o excepie ntr-o


metod fr a o intercepta n metoda respectiv


Unele programe care folosesc o anume metod ar trebui


s se termine pur i simplu la aruncarea unei excepii,
iar altele nu
n atare cazuri, programul care folosete invocarea
metodei ar trebui s o includ ntr-un bloc try i s
intercepteze excepia ntr-un bloc catch care urmeaz

n acest caz, metoda n sine nu va include blocuri


try i catch


34

Declararea excepiilor n clauza throws

Aruncarea unei excepii ntr-o metod




OOP8 - M. Joldo - T.U. Cluj

Dac o metod poate arunca o excepie, dar nu o


intercepteaz, atunci ea trebuie s furnizeze un
avertisment



Acest avertisment se numete clauz throws


Procesul de includere a unei clase excepie ntr-o clauz
throws se numete declararea excepiei
throws OExceptie

//clauza throws

Urmtorul cod declar c invocarea lui oMetoda poate


cauza aruncarea lui OExceptie
public void oMetoda() throws OExceptie

Totui, trebuie s conin o clauz throws

main( ) este o metod care poate avea i ea


specificarea unei excepii:

public static void main(String[] args) throws Exception


20.04.2006

OOP8 - M. Joldo - T.U. Cluj

35

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

36

Regula "prinde sau declar"

Declararea excepiilor n clauza throws




Dac o metod poate arunca mai mult de un


fel de excepie, atunci tipurile se separ prin
virgule

1. Codul care poate arunca o excepie este pus


ntr-un bloc try, iar excepia care poate
aprea este interceptat ntr-un bloc catch
din aceeai metod
2. Excepia posibil poate fi declarat la nceputul
definiiei metodei punnd numele clasei
excepie ntr-o clauz throws

public void oMetoda() throws


OExceptie, AltaExceptie


Dac o metod arunc o excepie i nu o


intercepteaz, atunci apelul metodei se
termin imediat

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

37

Cele mai obinuite excepii care ar putea fi


aruncate ntr-o metod trebuie tratate n
unul dintre urmtoarele dou moduri:

20.04.2006

Regula "prinde sau declar"





Cea de a doua tehnic este o modalitate de a deplasa


rspunderea pentru tratarea excepiei la metoda care a
inovat-o pe cea care a aruncat excepia

n oricare metod, ambele tehnici pot fi amestecate




Metoda apelant trebuie s trateze excepia, cu excepia


cazului n care folosete aceeai tehnic de "pasare"

39

Unele excepii pot fi interceptate, iar altele declarate n clauza


throws

Cu toate acestea, tehnicile menionate trebuie folosite


consistent pentru o excepie dat


ntr-un sfrit, fiecare excepie ar trebui interceptat de un


bloc catch din vreo metod care nu numai declar ntr-o
clauz throws ci i intercepteaz clasa de excepie
respectiv
OOP8 - M. Joldo - T.U. Cluj

38

Regula "prinde sau declar"

Prima dintre tehnici trateaz o excepie ntr-un bloc catch

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

Dac o excepie nu este declarat, atunci ea trebuie tratat n


metod
Dac este declarat excepia, atunci responsabilitatea pentru
tratarea ei este pasat unei alte metode care o apeleaz
Observai c dac definiia unei metode include invocarea unei a
doua metode, iar cea de a doua poate arunca o excepie i nu o
intercepteaz, atunci prima metod trebuie s o declare sau s o
intercepteze

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

40

Excepii de la regula "prinde sau


declar"

Excepii verificate i neverificate




Excepiile care sunt supuse regulii "prinde sau


declar" sunt numite excepii verificate





Compilatorul verific pentru a vedea dac excepiile sunt


luate n considerare fie ntr-un bloc catch, fie ntr-o
clauz throws
Clasele Throwable, Exception, precum i toi
descendenii clasei Exception constituie excepii
verificate

Toate celelalte excepii sunt neverificate


Clasa Error i toate clasele care descind din ea
sunt numite clase eroare


41

OOP8 - M. Joldo - T.U. Cluj

Programele n care pot fi aruncate aceste


excepii nu se vor compila pn cnd excepiile
respective nu sunt tratate corespunztor

Excepiile neverificate nu sunt supuse regulii


"prinde sau declar"


Clasele eroare nu sunt supuse regulii "prinde sau


declar"

20.04.2006

Excepiile verificate trebuie s respecte


regula "prinde sau declar"

Programele n care apar astfel de excepii


trebuie pur i simplu corectate ntruct au erori
de alt fel, dac compilatorul semnaleaz erori

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

42

Ierarhia obiectelor Throwable


(aruncabile)

Excepii verificate i neverificate

Excepii
verificate
Excepii neverificate

Excepii verificate

Observaie: Toi descendenii clasei


Throwable pot fi aruncai i
interceptai ntr-un bloc catch

Not. Aici este o mic


parte a ierarhiei.
20.04.2006

OOP8 - M. Joldo - T.U. Cluj

43

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

44

Ce se ntmpl dac o excepie nu este


interceptat?

Clauza throws n clase derivate




La suprascrierea unei metode ntr-o clasa


derivat, aceasta trebuie s aib aceleai
clase excepie precum cele listate n clauza
throws din clasa de baz


sau un subset al acestora

O clas derivat nu poate aduga excepii la


clauza throws


Dac fiecare metod pn la, i inclusiv, metoda


main include o clauz throws, excepia respectiv
poate fi aruncat, dar poate s nu fie interceptat
niciodat

dar poate terge cteva




20.04.2006

OOP8 - M. Joldo - T.U. Cluj

45

ntr-un program GUI (adic un program cu o interfaa


cu ferestre, grafic) nu se ntmpl nimic atta doar
c utilizatorul poate fi lsat ntr-o situaie ne-explicat,
iar programul poate s nu mai fie sigur
n programe non-GUI, aceasta face ca programul s se
termine cu un mesaj de eroare care d numele clasei
excepie

Fiecare program bine scris trebuie n cele din urm s


intercepteze fiecare excepie printr-un bloc catch n
una dintre metodele sale

20.04.2006

Propagarea excepiei

OOP8 - M. Joldo - T.U. Cluj

Un alt exemplu
public void doFileWork(String
filename) throws
DatabaseException{
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try{
fos = new
FileOutputStream(filename);
oos = new
ObjectOutputStream(fos);
oos.writeObject(obj);
}
catch(IOException e){
throw new DatabaseException(
"Problem while working with
"+filename+": "
+e.getMessage());
}

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

46

47

20.04.2006

finally{
try{
if(oos!=null){
oos.close();
}
if(fos!=null){
fos.close();
}
}
catch(IOException e){
throw new DatabaseException(
"Problem while working with
"+filename+": "
+e.getMessage());
}
}
}

OOP8 - M. Joldo - T.U. Cluj

48

Explicaii pentru exemplu

Cnd s folosim excepiile




Excepiile trebuie rezervate pentru situaiile n care


o metod ntlnete un caz neobinuit sau

neateptat, care nu poate fi tratat cu uurin n


vreun alt mod


Atunci cnd trebuie folosit tratarea excepiilor,


folosii aceste recomandri:


20.04.2006

OOP8 - M. Joldo - T.U. Cluj

49

Includei instruciuni throw i precizai clasele excepie


ntr-o clauz throws din definiia metodei respective
Plasai blocurile try i catch ntr-o metod diferit

20.04.2006

Cnd s folosim excepiile




Iat un exemplu de metod din


care este aruncat o excepie:
public void oMetoda()
throws OExceptie {
. . .
throw new
OExceptie(UnArgument);
. . .
}

Atunci cnd oMetoda este


folosit de altaMetoda,
altaMetoda trebuie s trateze
excepia:

20.04.2006

50

Ghid pentru excepii

public void altaMetoda()


{
try {
oMetoda();
. . .
}
catch (OExceptie e) {
CodPentruTratareaExceptiei
}
. . .
}

OOP8 - M. Joldo - T.U. Cluj

OOP8 - M. Joldo - T.U. Cluj

51

Dac metoda ntlnete o condiie anormal pe


care nu o poate trata, atunci trebuie s arunce o
excepie.
Evitai folosirea excepiilor pentru a indica situaii
care pot fi ateptate ca parte a funcionrii
normale a metodei.
Dac metoda descoper c clientul i-a nclcat
obligaiile contractuale (spre exemplu, prin
transmiterea de date de intrare neconforme
specificaiei), atunci aruncai o excepie
neverificat.

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

52

Ghid pentru excepii




Re-aruncarea excepiilor

Dac metoda nu-i poate ndeplini contractul,


atunci aruncai fie o excepie verificat, fie una
neverificat.
Dac aruncai o excepie pentru o situaie
anormal despre care considerai c programatorii
trebuie s decid n mod contient cum s o
trateze, atunci aruncai o excepie verificat.
Definii sau alegei o clas excepie care exist
deja pentru fiecare fel de condiie anormal care
poate face ca metoda Dvs. s arunce o excepie.

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

53

Dup interceptarea unei excepii, ea poate fi re-aruncat


dac e cazul.
La re-aruncarea unei excepii putem alege locaia din care
se va vedea ca aruncat obiectul n trasarea stivei de
execuie.


Putem face ca excepia re-aruncat s par a fi aruncat din locul


excepiei originale sau
din locul re-aruncrii.

Pentru a re-arunca o excepie cu indicarea locaiei


originale, pur i simplu o aruncm din nou:

try {
cap(0);
} catch(ArithmeticException e) {
throw e;
}
20.04.2006

OOP8 - M. Joldo - T.U. Cluj

54

Re-aruncarea excepiilor


Pentru a avea locaia real din care a fost re-aruncat


apelm metoda fillInStackTrace() a excepiei.

Metoda seteaz informaia din trasarea stivei pe baza contextului de


execuie curent. Exemplu:
try {
cap(0);
}
catch(ArithmeticException e) {
throw (ArithmeticException)e.fillInStackTrace();
}


Exemplu BlueJ

(DataSetReader)

Apelm fillInStackTrace() pe linia cu instruciunea


throw astfel numrul de linie din trasare este la fel cu
cel unde apare instruciunea throw.


Metoda fillInStackTrace() returneaz o referin la clasa


Throwable, aa c e nevoie de o conversie de tip la tipul real de
excepie.

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

55

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

56

Rezumat








Excepii i erori
Excepii verificate i neverificate
Instruciunile try i catch
Clauza finally
Regula "prinde sau declar"
Clauza throws
Instruciunea throw

20.04.2006

OOP8 - M. Joldo - T.U. Cluj

57