You are on page 1of 10

Izuzetak

Izuzetak je greka (vanredno stanje) pri izvravanju


programa
Java ima mehanizam za obradu izuzetaka
11. Izuzeci Izuzetak moe da se:
izazove (baci) - rezervisana re throw
uhvati radi obrade - rezervisana re catch
Izuzetak je objekat koji se pravi kad nastane vanredno
stanje u nekom metodu
Izuzetak moe da napravi Javin izvrni sistem ili moe
da se napravi u kodu kad se otkrije greka
Metod moe da obradi izuzetak ili da ga prosledi dalje
pozivajuem metodu
1 2

Rezervisane rei za obradu izuzetaka Obrada izuzetka


try Unutar try bloka su naredbe koje mogu da izazovu
catch izuzetak
throw Izuzetak se hvata pomou rezervisane rei catch
throws Rezervisana re throw slui za bacanje izuzetka
finally Ako unutar metoda A moe da nastane izuzetak koji se
prosleuje pozivajuem metodu B, tada u metodu A taj
tip izuzetka mora da se oznai pomou rezervisane rei
throws
Naredbe koje moraju da se izvre i kad se pojavi
izuzetak treba staviti u blok finally

3 4
Primer za izuzetak koji se ne obrauje u kodu
Neuhvaeni izuzeci
class Izuzetak0 {
public static void main (String args[]) {
Ako se u kodu ne obradi izuzetak, obrauje ga Javin int d = 0;
izvrni sistem koji ispisuje tekst sa opisom izuzetka, int a = 7 / d;
stanje steka za metode od trenutka nastanka izuzetka i System.out.println(a);
zavrava program }
Primer: }
Pri deljenju nulom Javin izvrni sistem pravi izuzetak tipa java.lang.ArithmeticException: / by zero
ArithmeticException i baca ga at Izuzetak0.main(Izuzetak0.java:4)
Exception in thread "main"

Vidi se da je izuzetak nastao u klasi Izuzetak0, metod main,


u naredbi koja je u etvrtoj liniji fajla
Izuzetak je tipa ArithmeticException
5 6

Novi primer neobraenog izuzetka


Opti oblik bloka za obradu izuzetaka
class Izuzetak1 {
try {
static void izracunaj() {
// blok u kojem moe da se pojavi izuzetak
int d = 0;
}
int a = 7 / d;
catch (TipIzuzetka1 excObj) {
System.out.println(a);
// kod za obradu izuzetka tipa TipIzuzetka1
}
}
public static void main (String args[]) {
catch (TipIzuzetka2 excObj) {
Izuzetak1.izracunaj();
// kod za obradu izuzetka tipa TipIzuzetka2
}
}
}
...
java.lang.ArithmeticException: / by zero finally {
at Izuzetak1.izracunaj(Izuzetak1.java:4) // blok koda koji mora da se izvri
at Izuzetak1.main(Izuzetak1.java:8) // pre kraja bloka try
Exception in thread "main" }
7 8
Primer obraenog izuzetka
class Izuzetak2 { Korienje try i catch
public static void main(String args[]) {
int d, a;
try i catch su jedinstvena celina
try { catch se odnosi samo na prethodni try
d = 0; Iza naredbi try uvek dolazi blok unutar vitiastih
a = 7 / d; zagrada (vitiaste zagrade su obavezne), a isto vai i za
System.out.println("Ovo se ne prikazuje."); catch
} catch slui da uhvati izuzetak koji se obrauje unutar
catch (ArithmeticException e) { tog catch bloka, posle ega se program nastavlja
System.out.println("Deljenje nulom."); prvom naredbom ispod svih catch blokova jedne
} naredbe try
System.out.println("Posle naredbe catch.");
}
}
Deljenje nulom.
9 10
Posle naredbe catch.

Tipovi izuzetaka Prikazivanje opisa izuzetka


Throwable je nadklasa svih U klasi Throwable redefinisan je metod toString
klasa za izuzetke tako da vraa opis izuzetka
Error je klasa za izuzetke
Javinog izvrnog sistema, npr. Throwable
prekoraenje steka, i programi
obino ne obrauju ove izuzetke
Exception je nadklasa za
Exception Error
izuzetke koje obrauju programi
RuntimeException je
nadklasa za neproveravane
izuzetke npr. aritmetike greke RuntimeException
(ArithmeticException),
indeksiranje niza izvan opsega
(ArrayIndexOutOfBoundsEx
ception)
11 12
Primer prikazivanja opisa izuzetka
Viestruki catch
class OpisIzuzetka {
static void izracunaj() {
Ako se unutar bloka try moe pojaviti vie razliitih
int d = 0;
izuzetaka treba staviti vie odredbi catch, po jedna za
int a = 7 / d;
System.out.println(a); svaki tip izuzetka koji se obrauje
} Posle pojave izuzetka izvrava se prvi catch blok iji
public static void main (String args[]) { tip izuzetka odgovara nastalom izuzetku, a svi ostali
try { catch blokovi se preskau
Izuzetak1.izracunaj();
}
catch (ArithmeticException e) {
System.out.println(e);
}
}
}

java.lang.ArithmeticException: / by zero
13 14

Primer viestrukog catch


class DvaTipaIzuzetka { Rezultat izvravanja programa
public static void main(String args[]) {
try { Prvo izvravanje programa, ne zadaju se argumenti
int a = args.length; C:\java DvaTipaIzuzetka
System.out.println("Broj argumenata = " + a); Broj argumenata = 0
int b = 7 / a; Deljenje nulom: java.lang.ArithmeticException: / by zero
int c[] = { 1 }; Iza try/catch blokova.
c[2] = 9;
}
Drugo izvravanje programa, zadaju se dva argumenta
catch(ArithmeticException e) {
C:\java DvaTipaIzuzetka dve reci
System.out.println("Deljenje nulom: " + e);
Broj argumenata = 2
}
Nevaei indeks niza: java.lang.ArrayIndexOutOfBoundsException
catch(ArrayIndexOutOfBoundsException e) {
Iza try/catch blokova.
System.out.println("Nevaei indeks niza: " + e);
}
System.out.println("Iza try/catch blokova.");
}
} 15 16
Primer viestrukog catch sa grekom
Viestruki catch class IzuzetakPotklasePreNatklase {
public static void main(String args[]) {
Ako iza bloka try ima vie blokova catch, potklase
try {
izuzetaka moraju da se pojave pre svojih natklasa jer
int a = 0;
catch sa tipom natklase hvata i izuzetke svih svojih
int b = 7 / a;
potklasa
}
catch(Exception e) {
System.out.println("catch tipa Exception.");
}
catch(ArithmeticException e) {
// ArithmeticException je potklsa klase Exception i mora se
// pojaviti u catch pre klase Exception (greka u prevoenju)
System.out.println("Nedostupan kod.");
}
}
17 } 18

Primer ugnjedenog try


Ugnjedene naredbe try class UgnjezdeniTry {
public static void main(String args[]) {
try { // Spoljanji try blok
Naredba try moe da bude unutar druge naredbe int a = args.length;
try System.out.println("Broj argumenata = " + a);
int b = 42 / a; // Deljenje nulom za a=0
Ako se izuzetak ne uhvati u catch delovima untranje try { // Unutranji try blok
naredbe try, preuzima ga spoljanja naredba try if(a==1) a = a/(a-a); // Deljenje nulom za a=1
if(a==2) {
Nastavlja se sve dok nek catch blok ne uhvati int c[] = { 1 };
izuzetak, ili dok izuzetak ne doe do Javinog izvrnog c[42] = 99; // Greka u indeksiranju za a=2
sistema }
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Unutranji try: " + e);
}
}
catch(ArithmeticException e) {
System.out.println("Spoljanji try: " + e);
}
}
19 20
}
Rezultat izvravanja programa Ugnjedeni try u metodima

Prvo izvravanje programa, ne zadaju se argumenti try naredbe su ugnjedene i u sledeem sluaju:
C:\java UgnjezdeniTry metod A ima try blok
Broj argumenata = 0
metod B ima try blok
Spoljanji try: java.lang.ArithmeticException: / by zero
metod A se poziva unutar try bloka metoda B

Drugo izvravanje programa, zadaje se jedan argument U ovom primeru try blok metoda A je ugnjeden
C:\java UgnjezdeniTry x unutar try bloka metoda B
Broj argumenata = 1
Spoljanji try: java.lang.ArithmeticException: / by zero

Tree izvravanje programa, zadaju se dva argumenta


C:\java UgnjezdeniTry dve reci
Broj argumenata = 2
Unutranji try: java.lang.ArithmeticException: / by zero
21 22

Primer ugnjedenog try


class UgnjezdeniTry1 { Rezervisana re throw
static void unutrasnjiTry(int a) {
try {
if(a==1) a = a/(a-a); // Deljenje nulom za a=1 Izuzetak se baca pomou naredbe throw
if(a==2) { // Greka u indeksiranju za a=2
int c[] = { 1 }; c[2] = 99; Opti oblik naredbe je
}
} throw objekatIzuzetka;
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Unutranji try: " + e);
objekatIzuzetka je objekat klase Throwable ili neke
} potklase ove klase
}
objekatIzuzetka se moe napraviti operatorom new
public static void main(String args[]) {
try { ili moe biti objekat uhvaen u naredbi catch
int a = args.length;
System.out.println("Broj argumenata = " + a); Posle bacanja izuzetka prelazi se na hvatanje izuzetka u
int b = 42 / a; // Deljenje nulom za a=0 naredbi try bloka koji obuhvata naredbu throw
UgnjezdeniTry1.unutrasnjiTry(a);
}
catch(ArithmeticException e) {
System.out.println("Spoljanji try: " + e);
}
}
23 24
}
Primer za throw
class PrimerZaThrow { Rezultat izvravanja programa
static void bacanjeIzuzetka() {
try { C:\java PrimerZaThrow
throw new NullPointerException("proba"); Hvatanje unutar metoda.
} Ponovo uhvaen: java.lang.NullPointerException: proba
catch(NullPointerException e) {
System.out.println("Hvatanje unutar metoda.");
throw e; // novo bacanje izuzetka
}
}
public static void main(String args[]) {
try {
bacanjeIzuzetka();
}
catch(NullPointerException e) {
System.out.println("Ponovo uhvaen: " + e);
}
}
} 25 26

Konstruktori izuzetaka Rezervisana re throws

Javini ugraeni izuzeci imaju dva konstruktora, jedan Za metod koji baca izuzetke mora da se oznai koje
bez parametara i jedan iji je parametar znakovni niz koji izuzetke baca
je opis izuzetka Moraju se navesti svi izuzeci koje baca metod izuzev
Opis izuzetka se moe dohvatiti metodom izuzetaka tipa Error i RuntimeException ili njihovih
getMessage() koji je definisan u klasi Throwable potklasa
Izuzeci koji ne moraju da se navode nazivaju se
neproveravani izuzeci, a oni koji moraju da se navode
nazivaju se proveravani izuzeci
Ako se ne navedu izuzeci koje metod baca javlja se
greka u prevoenju
Opti oblik deklaracije metoda je
tip imeMetoda(listaParametara) throws listaIzuzetaka

27 28
Ispravan primer za throws
Primer za throws sa grekom class PrimerZaThrows {
static void bacanjeIzuzetka() throws
class PrimerZaThrows { IllegalAccessException {
static void bacanjeIzuzetka() { System.out.println("Unutar metoda.");
System.out.println("Unutar metoda."); throw new IllegalAccessException("proba");
throw new IllegalAccessException("proba"); }
} public static void main(String args[]) {
try {
public static void main(String args[]) {
bacanjeIzuzetka();
bacanjeIzuzetka();
}
} catch(IllegalAccessException e) {
} System.out.println("Uhvaen: " + e);
}
Izuzetak tipa IllegalAccessException je }
proveravani izuzetak i ako se ne u deklaraciji metoda koji }
ga baca javlja se greka u prevoenju
Unutar metoda.
29 Uhvaen: java.lang.IllegalAccessException: proba 30

Primer za finally
Rezervisana re finally class PrimerZaFinally {
static void metodA() {
Prilikom pojavljivanja i obrade izuzetka dolazi do try { // Izuzetak unutar try bloka
preskakanja pojedinih naredbi System.out.println("Unutar metoda A");
throw new RuntimeException("proba");
Naredbe koje se ne smeju peskoiti, npr. zatvaranje }
fajla, stavljaju se u blok finally finally {
Blok finally se izvrava uvek bez obzira da li se System.out.println("Metod A: finally blok");
}
pojavljuje izuzetak ili ne }
Ako se metod prekida iz bloka try/catch zbog static void metodB() {
pojave izuzetka ili zbog naredbe return, blok try {
finally se izvrava neposredno pre izlaska iz metoda System.out.println("Unutar metoda B");
return; // return unutar try bloka
Blok finally nije obavezan }
Naredba try mora imati bar jednu od naredbi catch finally {
ili finally System.out.println("Metod B: finally blok");
}
31 } 32
Primer za finally
static void metodC() { Rezultat izvravanja programa
try { // try bloka koji se ne prekida
System.out.println("Unutar metoda C"); C:\java PrimerZaFinally
} Unutar metoda A
finally { Metod A: finally blok
System.out.println("Metod C: finally blok"); Uhvaen izuzetak
} Unutar metoda B
} Metod B: finally blok
public static void main(String args[]) { Unutar metoda C
try { Metod C: finally blok
metodA();
}
catch (Exception e) {
System.out.println("Uhvaen izuzetak");
}
metodB();
metodC();
}
} 33 34

Ugraeni izuzeci Pravljenje novih klasa za izuzetke


Klase za nove izuzetke se prave da bi se obraivale
specifine greke programa koji se pie
Klase za nove izuzetke treba izvoditi iz klase Exception
Klasa Exception ne definie nijedan metod ve sve
nasleuje od klase Throwable
U novim klasama za izuzetke ne mora se redefinisati
nijedan metod, ali se to moe uraditi

35 36
Primer za pravljenje izuzetka
Primer za pravljenje izuzetka
class PrimerZaIzuzetak {
static void racunaj(int a) throws Izuzetak {
class Izuzetak extends Exception {
System.out.println("racunaj(" + a + ")");
private int podatak;
if(a > 10)
throw new Izuzetak(a);
Izuzetak(int a) { System.out.println("Normalan izlaz");
podatak = a; }
} public static void main(String args[]) {
try {
public String toString() { racunaj(1);
return "Izuzetak[" + podatak + "]"; racunaj(20);
} }
catch (Izuzetak e) {
}
System.out.println("Uhvaen " + e);
}
}
37 } 38

Rezultat izvravanja programa Korienje izuzetaka


C:\java PrimerZaIzuzetak Za obradu greaka i vanrednih situacija programa uvek
racunaj(1)
Normalan izlaz treba koristiti izuzetke
racunaj(20) Uvek kad metod ne moe da obavi posao treba da baci
Uhvaen Izuzetak[20]
izuzetak
Nikad ne treba koristiti vraanje ifre greke kao nain
na koji metod prijavljuje da se pojavila greka

39 40

You might also like