Java - Rukovanje izuzecima (Exception Handling)


U prethodnoj lekciji naučili smo o Java izuzecima. Znamo da izuzeci nenormalno prekidaju izvršavanje programa. Zbog toga je važno postupati s izuzecima. Evo popisa različitih pristupa za rješavanje izuzetaka u Javi.

  • try...catch blok
  • finally blok
  • Bacanje i throws ključna riječ (throw and throws keyword)


Java try...catch blok

Blok try-catch koristi se za rukovanje izuzecima u Javi. Evo sintakse try...catch bloka:

try {
  // Kod
}
catch(Exception e) {
  // Kod
}

Ovdje smo unutar bloka try postavili kod koji bi mogao generisati izuzetak. Nakon svakog pokušaja bloka sljedi blok catch. Kad se dogodi izuzetak, hvata je blok catch. Blok catch ne može se koristiti bez bloka try.


Primjer: Rukovanje izuzecima pomoću try...catch bloka

class Main {
  public static void main(String[] args) {

    try {

      // Kod koji generiše izuzetak
      int divideByZero = 5 / 0;
      System.out.println("Ostatak koda u try bloku");
    }
    
    catch (ArithmeticException e) {
      System.out.println("ArithmeticException => " + e.getMessage());
    }
  }
}

U primjeru pokušavamo podijeliti broj s 0. Ovdje ovaj kod generiše izuzetak. Kako bismo riješili izuzetak, stavili smo kod 5/0 unutar bloka try. Sada kada se dogodi izuzetak, ostatak koda unutar bloka try se preskače. Blok catch hvata izuzetak i izvode se naredbe unutar bloka catch. Ako niti jedan izraz u bloku try ne generiše izuzetak, blok catch se preskače.



Java finally blok

U Javi se finally blok uvijek izvodi bez obzira postoji li izuzetak ili ne. Blok finally nije obavezan. Za svaki try blok može se postojati samo jedan finally blok. Osnovna sintaksa finally block je:

try {
  // Kod
}
catch (ExceptionType1 e1) { 
  // catch blok
}
finally {
  // finally blok se uvijek izvršava
}

Ako se dogodi izuzetak, finally blok izvršava se nakon bloka try...catch. U suprotnom se izvršava nakon bloka try...catch. Za svaki blok try može se postojati samo jedan finally blok.


Primjer: Rukovanje izuzetcima u Javi pomoću finally

class Main {
  public static void main(String[] args) {
    
    try {
      // Kod koji generiše izuzetak
      int divideByZero = 5 / 0;
    }

    catch (ArithmeticException e) {
      System.out.println("ArithmeticException => " + e.getMessage());
    }
    
    finally {
      System.out.println("Ovo je finally blok");
    }
  }
}

U gornjem primjeru dijelimo broj s 0 unutar bloka try. Ovaj kod generiše ArithmeticException. Izuzetak se hvata u bloku catch i tada se finally blok izvršava.



Java bacanje i throws ključna riječ (throw and throws keyword)

Ključna riječ throw se koristi za izričito izbacivanje jednog izuzetka. Kada izbacimo izuzetak, tok programa prelazi iz bloka try u blok catch.


Primjer: Rukovanje izuzecima pomoću throw

class Main {
  public static void divideByZero() {

    // Bacanje izuzetka (throw an exception)
    throw new ArithmeticException("Pokušaj podjeliti s 0");
  }

  public static void main(String[] args) {
    divideByZero();
  }
}

U primjeru izričito bacamo ArithmeticException pomoću ključne riječi throw. Slično, ključna riječ throws koristi se za deklarisanje vrste izuzetka koji se može pojaviti unutar metode. Koristi se u deklaraciji metode.


Primjer: Java throws ključna riječ

import java.io.*;

class Main {
  // Deklarisanje vrste izuzetka
  public static void findFile() throws IOException {

    // Kod koji može generisati IOException
    File newFile = new File("test.txt");
    FileInputStream stream = new FileInputStream(newFile);
  }

  public static void main(String[] args) {
    try {
      findFile();
    }
    catch (IOException e) {
      System.out.println(e);
    }
  }
}

Kad pokrenemo ovaj program, ako datoteka test.txt ne postoji, FileInputStream baca datoteku FileNotFoundException koja proširuje klasu IOException. Metoda findFile() navodi da se može izbaciti IOException. Metoda main() poziva ovu metodu i obrađuje izuzetak ako je bačena. Ako metoda ne obrađuje izuzetak, vrsta izuzetak koji se može pojaviti unutar nje mora biti navedena u klauzuli throws.