You are on page 1of 50

Izu zeci

Exceptions
Greške u programu
Prilikom pisanja iole ozbiljnih programa greške
su česta, gotovo, neizbežna stvar
Kao ozbiljan problem nameće se obrada svih
ulaza
Dobar program mora imati mogućnost da na
sve ulaze odgovori na adekvatan način
Da li vam se dogodio bar jedan
 Da li Vam se dogodio bar jedan izuzetak...
 Poruka u statusnoj liniji za razne vrste grešaka
SecurityExceptions,
ArrayIndexOutOfBoundsExceptions,
NullPointerException ....
Izuzetak
 Izuzetak je neželjeni događaj koji prekida tok
programa.
 Kada se dogodi izuzetak, izvršenje programa
se prekida. U takvim slučajevima dobijamo
poruku o grešci generisanu sistemom.
 Programer može upravljati takvim
dogadjajima (exception handling).
preduzimanjem odredjenih aktivnosti.
 Kada se program prekine to je zato što je
izuzetak izbačen (An exception was trown)
Izuzeci mogu biti izbačeni od strane sistema ili
eksplicitno izbačeni od strane programa
 Mnogi programski jezici ne nude nikakvu
pomoć za upravljanje greškama.
 Na programeru je da sam formira kodove za
greške i da piše funkcije koje će vraćati kod
greške koja se dogodila.
 Za razliku od toga Java nudi mogućnost
upravljanja izuzetnim situacijama (exception
handling).
Na primer
 public class ExceptionDemo

 public static void main(String[] args) {


 int a[]=new int[10];


 //Array has only 10 elements
 a[11] = 9;
 }

 }
Java runtime system izbacuje izuzetak
ArrayIndexOutOfBoundsException,
I zavrsava program

Izbacivanje izuzetka je upozorenje na problem za koji se


treba pobrinuti.
Prevazilaženje
Naredbu koja izbacuje izuzetak zatvorimo unutar try-
catch bloka.
 class ExceptionDemo
 {
 public static void main(String args[])
 {
 try{
 int a[]=new int[10];
 //Array has only 10 elements
 a[11] = 9;
 }
 catch(ArrayIndexOutOfBoundsException e){
 System.out.println ("ArrayIndexOutOfBounds");
 }
 }
 }
Struktura klasa za rad sa izuzecima

Object

Throwable

Error Exception

RuntimeException
Vrste izuzetaka
Izuzeci su objekti neke podklase klase
java.lang.Throwable. Mogu biti:
• Provereni izuzeci (Checked Exceptions)
• Greške (Errors)
• Neprovereni izuzeci (Runtime Exceptions)
Klasa Error
 Klasa Error koja je u vrhu jedne od grana je osnovna
klasa za klase koje reprezentuju teške otkaze koji se
dešavaju u toku izvršavanja programa, poput, recimo,
otkaza prilikom dinamičkog vezivanja.
 Tipičan Java program gotovo nikad neće raditi sa
ovakvim tipom greske.
 Program se sruši pre nego sto pokuša da obradi
grešku.
Provereni I ne provereni
izuzeci
 Glavna razlika između proverenog i
neproverenog izuzetka je u tome što se
provereni izuzeci proveravaju u vreme
kompajliranja, dok se neprovereni izuzeci
proveravaju tokom izvrsenja programa.
Provereni izuzeci
(Checked Exceptions)
 Svi izuzeci osim runtime izuzetaka tokom
izvođenja poznati su kao Provereni izuzeci,
jer ih kompajler proverava tokom
kompajliranja da bi utvrdio da li ih je
programer obrađivao ili ne.
 Ako se ovi izuzeci ne obrade / ne deklarišu u
programu, dobićete grešku pri kompajliranju.
Neprovereni izuzeci
RuntimeException
 Posebnu važnost među svim naslednicima klase
Exception ima klasa RuntimeException.
 Ona, kao i njeni naslednici predstavljaju situacije
koje se ne moraju proveravati.
RuntimeException
 Ovi izuzeci se ne proveravaju tokom vremena
kompajliranja, tako da prevodilac ne
proverava da li ih je programer obrađivao ili
ne, ali odgovornost programera je da obradi
ove izuzetke i obezbedi siguran izlazak.
Na primer, izuzetak
NullPointerException može da se javi bilo gde u
programu kad se obraćamo objektu preko
null reference. (ukoliko pokusate da koristite
promenljivu pre nego sto joj dodelite objekat)
Cena pisanja handler-a za sve takve situacije
daleko prevazilazi dobit od specificiranja i
hvatanja takvih izuzetaka pa nas kompajleri i
ne primoravaju da te izuzetke hvatamo
Klasa Exeption
klasa RuntimeExeptions
ArrayIndexOutOfBoundsException ,
SecurityException,
NullPointerException............
Ostale klase izuzetaka
EOFException,
MalformedURLException
IOException …
Važno pravilo
 Svaki izuzetak, osim izuzetaka čije su klase
izvedene iz klase RuntimeException, se mora
 Uhvatiti, i obraditi, ili
 specificirati da metod može proizvesti takav
izuzetak
Exception handling
 Upravljanja izuzetnim situacijama (exception
handling).
 kada se u nekom metodu dogodi neka izuzetna
situacija metod formira objekat (exception object)
koji onda predaje izvršnom okruženju na
upravljanje.
 Zadatak runtime okruženja je da pronađe deo koda
u programu koji će upravljati nastalim izuzetkom
(exception handler) ili da
 kada takvog koda nema, završi program i izda
poruku o grešci.
Exception handler
 Za traženje odgovarajućeg exception
handler-a runtime okruženje koristi stek sa
aktivacionim zapisima funkcija u programu.
 Pretraga tog steka počinje od funkcije koja je
proizvela izuzetak i nastavlja se naviše kroz
stek pozivanja sve dok se ne nađe funkcija
koja u svome telu sadrži kod za upravljanje
izuzetkom. (exception handler)
Exception objekat
 Exception objekat koji funkcija kreira i baca
prilikom izuzetnih situacija je Java objekat u
pravom smislu reči. To je objekat neke od
klasa koje su izvedene iz klase Exception i on
sadrži sve relevantne podatke o nastalom
izuzetku, uključujući i stanje programa u
trenutku njegovog nastanka.
Primer, za uvodjenje u
problematiku izuze taka
 Predpostavimo da pišemo funkciju koja treba
da učita neki fajl u memoriju.
Pseudo-kodom izraženo
rešenje
 read{
 otvoriti fajl;
 odrediti mu velicinu;
 alocirati dovoljno memorije;
 ucitati fajl u memoriju;
 zatvoriti fajl;
 }
Pri tom treba voditi računa o
sledećim stvarima
 da li je fajl uspešno otvoren,
 da li njegova dužina može uspešno da se
odredi,
 da li može da se alocira dovoljno memorije,
 šta ako fajl ne može da se čita,
 šta ako fajl ne može da se zatvori.
prethodni kod malo konkretnije
 errorCodeType read {
 inicijalizacija errorCode = 0;
 otvoriti fajl;
 if (fajl otvoren) {
 odrediti velicinu fajla;
 if (dobijena duzina fajla) {
 alocirati dovoljno memorije;
 if (alocirano dovoljno memorije) {
 ucitati fajl u memoriju;
 if (citanje nije moguce) {
 errorCode = -1;
 }
 } else {
 errorCode = -2;
 }
 }else }
 errorCode = -3;
 }
 zatvoriti fajl;
 if (fajl nije zatvoren && errorCode == 0) {
 errorCode = -4;
 } else {
 errorCode = errorCode and -4;
 }
 } else {
 errorCode = -5;
 }
 return errorCode;
 }
Isti kod Koristeći exception mehanizam
 read {
 try{
 otvoriti fajl;
 odrediti mu velicinu;
 alocirati memoriju;
 ucitati fajl u memoriju;
 zatvoriti fajl;
 } catch (fileOpenFailed) {
 obrada;
 } catch (sizeDeterminationFailed) {
 obrada;
 } catch (memoryAllocationFailed) {
 obrada;
 } catch (readFailed) {
 obrada;
 } catch (fileCloseFailed) {
 obrada;
 }
 }
Da bi ste uhvatili izuzetak

treba uraditi dve stvari


 Štititi kod koji sadrži metod koji možda
izbacuje izuzetak unutar bloka try
 Testirati I obraditi izuzetak unutar bloka
catch
 try{
 // naredbe koje mogu izazvati izuzetak
 }
 Tokom pisanja programa, ako mislite da
određene naredbe u programu mogu da
proizvedu izuzetak, smestite ih u try blok I
obradite taj izuzetak unutar bloka catch
 public void run(){
 for(int i=0; i<10; i++){
 System.out.println(i+" "+getName());
 try{
 sleep(2000);
 } catch (InterruptedException e) { }
 }
 System.out.println("uradio "+getName());
 }
 }
Try – catch ZNAČENJE

 Pokušaj da izvršiš ovaj deo koda koji možda


uzrokuje izuzetak, Ako se izvrši U REDU ,
nastavi sa programom,
 ako se ne izvrši, UHVATI IZUZETAK I
POZABAVI SE NJIME
 Metod klase Thread sleep potencijalno
moze da izbaci izuzetak tipa
InterruptedException
koji oznacava da je da je thread
prekinut iz nekog razloga.
Catch blok prihvata objekat tipa
InterruptedException
Try – catch ZNAČENJE
 Handler-i koji hvataju i obrađuju izuzetke su
prikačeni try bloku preko catch klauzula.
 Svaki catch po svom izgledu je sličan metodu
- on ima svoje zaglavlje u kome se deklariše
argument (samo jedan) čija klasa mora biti
neka od klasa izuzetaka i telo u kome se
nastali izuzetak obrađuje
Deklarisanje metoda koji mogu
da izbace izuzetak
 Da bi ste nagovestili da deo koda unutar nekog
metoda moze da izbaci izuzetak dodajete
kljucnu rec throws nakon potpisa metoda

Public boolean mojmetod (int x, int y) throws Izuzetak


Bacanje izuzetka throws
 Ako unutar neke metode ne želimo
eksplicitno hvatati neki izuzetak, možemo
pomoću ključne reči throws deklarisati da će
je metoda, u slučaju da se pojavi, izbaciti. To
prenosi odgovornost na metodu koja je
posmatranu metodu pozvala.
 public class Example{
 int division(int a, int b) throws ArithmeticException
 {
 int t = a/b;
 return t;
 }
 public static void main(String args[]){
 Example obj = new Example();
 try{
 System.out.println(obj.division(15,0));
 }
 catch(ArithmeticException e){
 System.out.println("You shouldn't divide
number by zero");
 }
 }
 }
Pravi la
 Ako vas metod poziva metod koji sadrzi
klauzulu throws mozete uraditi tri stvari …
 Obraditi izuzetak koriscenjem iskaza try
catch
 Proslediti izuzetak na gore uz lanac poziva
dodavanjem naredbe throws definiciji vaseg
metoda
 Koristeci oba prethodna metoda
Izuzeci implicitno izbaceni od
strane sistema
 Dve strane svakog izuzetka:
strana koja ga izbacuje i strana koja ga hvata
 Izuzetke izbacuje Javin runtime modul ili metode u
okviru Java biblioteka klasa. Ovi izuzeci su implicitno
izbaceni od strane sistema.
 Strana koja hvata, i obradjuje izuzetak , ili

specificira da metod može proizvesti izuzetak (izda


poruku o gresci)
 U javi postoji unapred definisana klasa
izuzetaka kao sto je:
ArithmeticException,
NullPointerException,
ArrayIndexOutOfBounds exception….
izuzeci implicitno izbaceni od
strane sistema
 Ovi izuzeci su već podešeni da se aktiviraju na
unapred definisanim uslovima, (npr… kada
podelite broj sa nulom aktivira se
ArithmeticException…kada pokušavamo da
pristupimo elementu niza van njegovih granica,
dobijamo ArrayIndexOutOfBoundsException…
Kreiranje i izbacivanje vaseg
izuzetka
 U javi možemo stvoriti sopstvenu klasu
izuzetka
 Ovi izuzeci su poznati kao korisnički definisani
izuzeci
 Pri tom definisemo sopstveni skup uslova ili
pravila i eksplicitno izbacujemo izuzetak
pomoću ključne reči throw
Kreiranje i izbacivanje vaseg
izuzetka
 Kao i svaki drugi objekat i izuzetak se kreira
korišćenjem konstruktora njegove klase i
operatora new.
 Njegovo bacanje runtime-u na upravljanje se
realizuje koristeći ključnu reč throw
 klasaIzuzetka može da bude bilo koje od
klasa izvedenih iz klase Throwable računajući
klase koje već postoje ali i one koje možemo
sami da definišemo.
Izbacivanje postojece klase
 Sintaksa throw:
throw new exception_class("error message");
 Na primer :

throw new ArithmeticException("dividing a


number by 5 is not allowed in this program");
Kreiranje sopstvenih izuzetaka
 class MyException extends Exception{
 String str1;
 /* Constructor of custom exception class
 * here I am copying the message that we are passing while
 * throwing the exception to a string and then displaying
 * that string along with the message.
 */
 MyException(String str2) {
 str1=str2;
 }
 public String toString(){
 return ("MyException Occurred: "+str1) ;
 }
 }
 class Example{
 public static void main(String args[]){
 try{
 System.out.println("Starting of try block");
 // I'm throwing the custom exception using throw

 throw new MyException("This is My error Message");


 }
 catch(MyException exp){
 System.out.println("Catch Block") ;
 System.out.println(exp) ;
 }
 }
 Starting of try block
 Catch Block
 MyException Occurred: This is My error Message
 Syntax of throw keyword:
throw new exception_class("error message");
 For example:

throw new ArithmeticException("dividing a


number by 5 is not allowed in this program");

You might also like