You are on page 1of 22

7

1
| IMI | PMF | KG | OOP | 13 | AKM |

Izuzeci
JAVA
Greke

Tokom izvravanja aplikacije javljaju se greke razliitih nivoa ozbiljnosti.


Pri pozivu nekog metoda, mogude je da doe do razliith vrsta
neregularnih stanja. Na primer:
7 prosleeni argumenti nisu odgovarajudi
| IMI | PMF | KG | OOP | 13 | AKM |

problem internog stanja objekta kome je poruka poslata


(nekonzistentne vrednosti polja)
greke na resursima ili podacima kojima metod manipulie
(npr. u fajlu ili mrenoj adresi)
Takve situacije mogu manje ili vie uticati na tok izvravanja programa, u
svakom sluaju tok programa se razlikuje od regularnog, tj. predstavlja
izuzetak od pravilnog.

2
Obrada greaka

Jedan nain rukovanja takvim (izuzetnim) situacijama jeste proveravanje


svih kritinih uslova pre navodjenja dela koda koji moe biti ugroen
neproverenim grekama.
7
GET A FILENAME
| IMI | PMF | KG | OOP | 13 | AKM |

OPEN THE FILE


IF THERE IS NO ERROR OPENING THE FILE
READ SOME DATA
IF THERE IS NO ERROR READING THE DATA
PROCESS THE DATA
WRITE THE DATA
IF THERE IS NO ERROR WRITING THE DATA
CLOSE THE FILE
IF THERE IS NO ERROR CLOSING FILE
RETURN

Mana ovakvog rada jeste neitak kod u kome se meaju


3 provera uslova za regularan tok programa i obrada u sluaju neispunjenosti uslova
kod koji se izvrava pri regularnom radu
Razdvajanje regularnog koda od obrade izuzetnih situacija

Da bi obezbedili razdvajanje koda koji se izvrava kada program tee glatko od


obrade neregularne situacije objektni jezici uvode:
1. posebnu vrstu upravljakog bloka try/catch/finally i
7 2. poseban mehanizam obavetavanja da se i ta desilo instanciranjem
| IMI | PMF | KG | OOP | 13 | AKM |

objekata specijalnog tipa i njegovim prosleivanjem onom delu koda koji je


u stanju da ga obradi.
try {
. . .
}
catch (ExceptionType1 exceptionObject) {
// obrada izuzetka tipa 1
TRY TO DO THESE THINGS: }
GET A FILENAME catch (ExceptionType2 exceptionObject) {
OPEN THE FILE // obrada izuzetka tipa 2
READ SOME DATA }
PROCESS THE DATA finally {
WRITE THE DATA . . .
CLOSE THE FILE }
4 RETURN
IF THERE WAS AN ERROR OPENING THE FILE THEN DO ...
IF THERE WAS AN ERROR READING THE DATA THEN DO ...
IF THERE WAS AN ERROR WRITING THE DATA THEN DO ...
IF THERE WAS AN ERROR CLOSING THE FILE THEN DO ...
Pojednostavljen model obrade greaka
upotrebom koncepta IZUZETAKA PRIMER 1
class Ssluzba { . . . main() {
void ispraviOcenu(Prijava p,int nova){ Ssluzba s; Prijava p;
try { // NADGLEDANI REGION . . .
. . . s.ispraviOcenu(p,5);
p.ocenaIspravka(nova);
7 . . .
. . .
}
| IMI | PMF | KG | OOP | 13 | AKM |

}
catch(Greska g) {
// obrada greske
} Delovi koda koji nede biti
//DEO KODA KOJI SE IZVRSAVA BEZ OBZIRA NA TRY/CATCH
}
izvreni
}

class Prijava{
int ocena; Student s; Predmet p;
. . .
void ocenaIspravka throws Greska (int nova) {
if !(p.ocena()>5 && nova>5 && nova<=10) {
Greska g = new Greska();
5 throw g;
}
else p.setOcena(nova);
}
}
Pojednostavljen model obrade greaka
upotrebom koncepta IZUZETAKA
Ko obavetava?
Metod tokom ijeg izvravanja se desila izuzetna situacija, koja zahteva
drugaije ponaanje pozivaoca metoda koji izuzetak baca.
7 Kako obavetava?
| IMI | PMF | KG | OOP | 13 | AKM |

Generie objekat specijalnog tipa (tipa IZUZETKA) i baca ga, tj. prosleuje ga
komandi throw.
Ko preuzima obavetenje?
throw JVM izvrava tako to preusmerava izvravanje programa na deo koda
koji je naveden u bloku za obradu odgovarajudeg tipa izuzetka, tj. za
prihvatanje objekata odgovarajudeg tipa (catch blok).
Koji je to specijalni tip objekta?
Objekat kojim se opisuje greka ne moe pripadati proizvoljnoj klasi. Klasa
kojoj objekat pripada mora da se nae u lancu nasleivanja klase
Throwable, jer sam Javin kompajler vri proveru tipa objekta pri prevoenju
throw komande.
6
ta je sa nenadgledanim delom koda (van try bloka)?
Ako dodje do bilo kakve greke van nadgledanog regiona, sigurno je da
metod u kom se greka desila nede istu zbrinuti, ved de greka biti delegirana
njegovom pozivaocu.
Pojednostavljen model obrade greaka
upotrebom koncepta IZUZETAKA
ta je sa nenadgledanim delom koda (van try bloka)?
Ako dodje do bilo kakve greke van nadgledanog regiona, sigurno je da
metod u kom se greka desila nede istu zbrinuti, ved de greka biti delegirana
7 njegovom pozivaocu, tj. metodu koji ga je pozvao.
| IMI | PMF | KG | OOP | 13 | AKM |

Zato se neobraen izuzetak po automatizmu prosleuje pozivaocu?


Zato to izuzetak, ako je ved generisan, mora da bude obraen. Njegovo
bacanje izaziva neregularan zavretak metoda u kome se javio, pa aplikacija
mora da ima predvienu reakciju na takvu situaciju.
Ako izuzetak ne obradi prvi metod kome je izuzetak prosleen, onda se
izuzetak delegira dalje, tj. njegovom pozivaocu (sve do main() metoda).

PRIMER 1. komentar
Klasa Prijava ima predvien metod prepravke ocene, ali samo u sluaju da u prijavi pie da je
student poloio i ako je nova ocena izmeu 6 i 10, tj. Ako se ne menja status poloenosti ispita. U
suprotnom se metod u kom se poziva prepravka ocene obavetava o tome da ispravka ocene nije
7 obavljena tako to se baca izuzetak.
Dakle, neuspena ispravka je logiki svrstana u izuzetak i to u funkcionisanju pozivaoca. Sama
prijava ne zavisi od toga, tj. Ona se brine o konzistentnosti svoga stanja, a onoga koji je pokuao da
je u nekonzistentno stanje dovede, obavetava o neuspehu njegove akcije. Da li de i kako poziva
reagovati nije briga prijave, ved onoga ko izuzetak treba da uhvati.
Lanac hvatanja izuzetka i call stack

Pretpostavimo da se u main() metodu u nekom trenutku poziva metod a() u


kome se poziva metod b(), a u njemu metod c().
c
O itavom lancu pozivanja i o tome koji je metod dokle b
7 stigao sa izvravanjem vodi rauna JVM. Struktura u a
| IMI | PMF | KG | OOP | 13 | AKM |

kojoj belei lanac pozivanja se naziva call stack. main

Zahvaljujudi call stack-u JVM zna koja je prva naredna komanda koja treba da
bude izvrena nakon regularnog zavretka nekog pozvanog metoda ili kome
treba da prosledi generisani izuzetak
u sluaju neregularnog zavretka Java Runtime
pozvanog metoda. Method
Calls
Ako JVM ne uspe ni u jednom main() method Travel
metodu na call stack-u da Down
Exceptions method a()
pronae obradu izuzetka
Passed
8 program prekida rad. Up
method b()

method c()

Exception
Thrown Here
Tipovi izuzetaka u Javi

Svi izuzeci su pokrivene dvema


Object direktnim podklasana klase -
7 Throwable
| IMI | PMF | KG | OOP | 13 | AKM |

Throwable

Error Exception

... RuntimeException
...

9 ...
Izuzeci tipa Error

Predstavljaju izuzetke za koje se ne oekuje da ih hvata korisnik.


Tri direktne podklase klase Error:
ThreadDeath: baca se kada se namerno zaustavi nit u izvravanju. Kada se ne
7 uhvati zavrava nit, a ne program.
| IMI | PMF | KG | OOP | 13 | AKM |

LinkageError: ozbiljne greke unutar klasa u programu (nekompatibilnosti


meu klasama, pokuaj kreiranja objekta nepostojede klase)
VirtualMachineError JVM greka

10
Izuzeci tipa Exception i, posebno, RunTimeException

Za skoro sve izuzetke koji su obuhvadeni podklasama klase Exception


potrebno je ukljuiti kod za njihovu obradu ili program nede prodi
kompajliranje, tj. prevodilac NE DOZVOLJAVA njihovo ignorisanje.
7 RunTimeException izuzeci se tretiraju drugaije, jer se u njih najede
| IMI | PMF | KG | OOP | 13 | AKM |

svrstavaju izuzeci koji se pojavljuju kao posledica ozbiljnijih greaka u kodu,


ija obrada ne bi mogla nita znaajno promenila. Prevodilac dozvoljava
njihovo ignorisanje.
Neke podklase klase RunTimeException:
ArithmeticException: neispravan rezultat aritmetike operacije poput
dijeljenja nulom.
IndexOutOfBoundsException: indeks koji je izvan dozvoljenih granica za
objekat poput niza, stringa ili vektora.
NegativeArraySizeException: upotreba negativnog indeksa niza.
NullPointerException: poziv metoda ili pristup podatku lanu null objekta.
ArrayStoreException: pokuaj dodeljivana reference pogrenog tipa elementu
11
niza.
ClassCastException: pokuaj kastovanja objekta neodgovarajudeg tipa.
Proveravani i neproveravani izuzeci

Na osnovu toga da li prevodilac insistira njihovom proveravanju ili ne, izuzeci se


dele u dve grupe:
proveravani izuzeci (checked)
7 Oni koji su izvedeni iz klase Exception i svi koji nisu u lancu
| IMI | PMF | KG | OOP | 13 | AKM |

RunTimeException klase.
Ako metoda baca neki proveravani izuzetak, poziv te metode mora
da bude uokviren try-catch blokom koji hvata taj izuzetak, a
metoda mora da bude oznaena kljunom rei throws i nazivom
klase izuzetka koji baca.
neproveravani izuzeci (unchecked)
Oni koji su izvedeni iz RunTimeException.Klase koje su navedene u tabeli
Javinih predefinisanih izuzetaka, uglavnom, nasleuju klasu
RuntimeException pa pripadaju grupi neproveravanih izuzetaka.
Ako metoda baca neki neproveravani izuzetak, poziv te metode
12 moe, ali ne mora biti uokviren try/catch blokom koji hvata taj
izuzetak.
Neproveravani izuzetak - primer

public class Izuz extends RunTimeException{


...
}
public class KK {
7 public void gr(int k) {
| IMI | PMF | KG | OOP | 13 | AKM |

if (k==0) throw new Izuz();


// regularno ponasanje metoda
}
}
public class TestIzuz {
public static void main(String args[]) {
KK k=new KK();
k.gr(0);
System.out.println(Regularan kraj programa!);
}
}

13 U ovom primeru baeni izuzetak nije obraen, pa


de program zavrti sa radom pre ispisa
Regularan kraj programa!
Proveravani izuzetak - primer

public class Izuz extends Exception{


...
}
public class KK { Dve greke koje
7 registruje kompajler
public void gr(int k) {
| IMI | PMF | KG | OOP | 13 | AKM |

if (k==0) throw new Izuz();


// regularno ponasanje metoda
}
}
public class TestIzuz {
public static void main(String args[]) {
KK k=new KK();
k.gr(0);
System.out.println(Regularan kraj programa!);
}
}

14
Proveravani izuzetak - primer

public class Izuz extends Exception{


...
}
public class KK {
7 Obavezan throws
public void gr(int k) throws Izuz{
| IMI | PMF | KG | OOP | 13 | AKM |

if (k==0) throw new Izuz();


// regularno ponasanje metoda
}
}
public class TestIzuz {
public static void main(String args[]) {
KK k=new KK();
k.gr(0);
System.out.println(Regularan kraj programa!);
}
}

15
Proveravani izuzetak - primer

public class Izuz extends Exception{


...
}
public class KK {
7 Obavezan throws
public void gr(int k) throws Izuz{
| IMI | PMF | KG | OOP | 13 | AKM |

if (k==0) throw new Izuz();


// regularno ponasanje metoda
} U ovom primeru u
} baeni izuzetak je
public class TestIzuz { uhvaden, pa de
public static void main(String args[]) { program nastaviti
KK k=new KK(); nakon catch-a dalje i
try { ispisati
Obavezan k.gr(0); Regularan kraj
try/catch } programa!
catch(Izuz o) {
// obrada situacije u kojoj k.gr() nije
16 // izvrsen na ocekivan nacin
}
System.out.println(Regularan kraj programa!);
}
}
Proveravani izuzeci - dodatak

Java je striktna u forsiranju proverenih izuzetaka. Ako se pozove metod koji


navodi izuzetak u njegovoj throws klauzuli postoje 3 mogudnosti:
uhvatiti i obraditi izuzetak
try {
7 // Code that originates an arithmetic exception
| IMI | PMF | KG | OOP | 13 | AKM |

}
catch (ArithmeticException e) {
// Deal with the exception here
}
uhvadeni izuzetak proslediti dalje (na pozivajudi nivo)
try {
// Code that originates an arithmetic exception
}
catch (ArithmeticException e) {
// Deal with the exception here
throw e; // Rethrow the exception to the calling program
}
uhvatiti izuzetak, generisati sopstveni i baciti ga pozivaocu
try {
17 // Code that originates an arithmetic exception
}
catch (ArithmeticException e) {
// Deal with the exception here
throw new SomeNewEcepton(); // Rethrow the exception
}
Napomena

Legalno je baciti izuzetke koji su izvedeni iz izuzetaka navedenih u throws


klauzuli.

7 public class NulaArgument extends Izuz{


| IMI | PMF | KG | OOP | 13 | AKM |

...
}
public class KK {
public void gr(int k) throws Izuz{
if (k==0) throw new NulaArgument();
// regularno ponasanje metoda
}
}

18
Obrada izuzetaka i viestruku catch blokovi

U delu try/catch bloka


catch (ExceptionType1 identifier) {
//
7 }
| IMI | PMF | KG | OOP | 13 | AKM |

kod koji obrauje izuzetak se poziva za ExceptionType1 ili bilo koju njegovu
podklasu.
Ako je u nekom try/catch bloku navedeno nekoliko catch blokova sa
nekoliko tipova izuzetaka u istoj klasnoj hijearhiji, potrebno je blokove
postaviti tako da se prvo hvata izuzetak najnie podklase, pa redom prema
najvioj superklasi.
// neispravna sekvenca catch blokova
// nee se prevesti
try {
// try block code
19 } catch(Exception e){ ... }
catch(ArithmeticException e){ ... }
Exception objekti

Klasa Throwable je bazna klasa za sve Java izuzetke i ima:


podatke
Poruku (message) (koja se inicijalizuje u konstruktoru)
Zapis o call steku (execution stack) u trenutku kada je izuzetak kreiran (pun naziv svih
7 pozvanih metoda, plus broj linije u kojoj se poziv dogodio)
| IMI | PMF | KG | OOP | 13 | AKM |

dva public konstruktora


default kontruktor
kontruktor koji prihvata argument tipa String (tu moe biti smetena informacija o prirodi
greke)
public metode koje omogudavaju pristup zapisu poruka i steka:
getMessage() - Vrada sadraj poruke (null za vedinu predefinisanih klasa)
printStackTrace() - Ispis poruka i steka na standardni izlaz
printStackTrace(PrintStream s)
fillInStackTrace() - aurira zapis steka za mesto gdje se poziv iste obavlja; koristi se
kada se ponovo baca izuzetak da bi se aurirao zapis steka kada je ponovo baena (korisno
kod bacanja sopstvenih izuzetaka)
e.fillInStackTrace();
throw e;
20
Definisanje novih izuzetaka

Dva osnovna razloga:


Dodavanje informacije kada se dogodi neki standardni izuzetak
Greka koja se dogaa u vaem kodu zasluna novog tipa izuzetka
7 Kako?
| IMI | PMF | KG | OOP | 13 | AKM |

// exception class minimalna definicija


public class DreadfulProblemException extends Exception
{
// Konstruktori
public DreadfulProblemException(){ } // Default constructor
public DreadfulProblemException(String s) {
super(s); // Call the base class constructor
}
}
to jo dodati?
druge konstruktore
varijable instance za uvanje dodatnih informacija
21 pristupne metode za varijable instance s dodatnim informacijama
finally blok

Koristi se za pospremanje (clean-up)


Asociran s odreenim try blokom (kao i catch blok)
Moe se koristiti i s try blokom koji sadri kod koji ne baca nikakav izuzetak:
7
za kod s viestrukim break ili return elementima,
| IMI | PMF | KG | OOP | 13 | AKM |

vrednosti koje vratimo s return u finally bloku de pregaziti bilo koji return
izvren u try bloku.

int metod(){
try {
//...
return 1;
}
finally {
return 2;
}
22 // nedohvatljiv deo koda, kompajler ne bi dozvolio
}

Metod iz primera vrada 2.

You might also like