Java - try...catch


Blok try...catch u Javi koristi se za rukovanje izuzecima i spriječava abnormalno prekidanje programa. Pogledajmo sintaksu try...catch bloka u Javi:

try{
  // Kod
}
catch(exception) {
  // Kod
}

Blok try uključuje kod koji bi mogao generisati izuzetak. Blok catch uključuje kod koji se izvršava kada dođe do izuzetka unutar try bloka.


Primjer: Java try...catch blok

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

    try {
      int divideByZero = 5 / 0;
      System.out.println("Ostatak koda u try bloku");
    }

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

U primjeru primijetite sljedeću liniju koda:

int divideByZero = 5 / 0;

Ovdje pokušavamo podijeliti broj s nulom. U tom slučaju dolazi do izuzetka. Zbog toga smo ovaj kod zatvorili unutar bloka try. Kada program naiđe na ovaj kod, dolazi do ArithmeticException. Izuzetak hvata blok catch i izvršava kod unutar bloka catch. Blok catch se izvršava samo ako postoji izuzetak unutar bloka try.



Java try...finally blok

Takođe možemo koristiti try bloka zajedno s blokom finally. U ovom slučaju, finally blok se uvijek izvodi bez obzira postoji li izuzetak unutar bloka try ili ne.


Primjer: Java try...finally blok

class Main {
  public static void main(String[] args) {
    try {
      int divideByZero = 5 / 0;
    }

    finally {
      System.out.println("Finally blok se uvijek izvršava");
    }
  }
}

U primjeru smo upotrijebili try bloka zajedno s finally blokom. Možemo vidjeti da kod unutar bloka try uzrokuje izuzetak. Međutim, kod unutar finally bloka izvršava se bez obzira na izuzetak.



Java try...catch...finally blok

U Javi takođe možemo koristiti finally konačno nakon bloka try...catch. Pogledajmo primjer:

import java.io.*;

class ListOfNumbers {

  // Kreiranje niza cijelih brojeva
  private int[] list = {5, 6, 8, 9, 2};

  // Metoda za pisanje podataka iz niza u fila
  public void writeList() {
    PrintWriter out = null;

    try {
      System.out.println("Unos iskaza try");

      // Kreiranje novog fajla OutputFile.txt
      out = new PrintWriter(new FileWriter("OutputFile.txt"));

      // Pisanje vrijednosti iz polja popisa u Output.txt
      for (int i = 0; i < 7; i++) {
        out.println("Vrijednost u: " + i + " = " + list[i]);
      }
    }
    
    catch (Exception e) {
      System.out.println("Exception => " + e.getMessage());
    }
    
    finally {
      // Provjerava da li je PrintWriter otvoren
      if (out != null) {
        System.out.println("Zatvaranje PrintWriter");
        // Zatvaranje PrintWriter
        out.close();
      }
      
      else {
        System.out.println("PrintWriter nije otvoren");
      }
    }

  }
}

class Main {
  public static void main(String[] args) {
    ListOfNumbers list = new ListOfNumbers();
    list.writeList();
  }
}

U gornjem primjeru stvorili smo niz s imenom list i datoteku pod nazivom output.txt. Ovdje pokušavamo čitati podatke iz niza i spremati ih u datoteku. Primjetite kod:

for (int i = 0; i < 7; i++) {
  out.println("Value at: " + i + " = " + list[i]);
}

Ovdje je veličina niza 5, a posljednji element niza nalazi se na list[4]. Međutim, pokušavamo pristupiti elementima na a[5] i a[6]. Dakle, kod generiše izuzetak koju hvata blok catch. Budući da se finally blok uvijek izvršava, uključili smo kod za zatvaranje PrintWriter unutar finally bloka. Dobra je praksa upotrijebiti finally blokiranje za uključivanje važnog koda za čišćenje, poput zatvaranja datoteke ili veze.



Više blokova za hvatanje (Multiple Catch blocks)

Za svaki blok try može postojati nula ili više blokova ulova. Više blokova ulova omogućava nam da različito postupamo sa svakim izuzetkom. Vrsta argumenta svakog bloka ulova označava vrstu izuzetka koju on može obraditi. Pogledajmo primjer:

class ListOfNumbers {
  public int[] arr = new int[10];

  public void writeList() {

    try {
      arr[10] = 11;
    }
    
    catch (NumberFormatException e1) {
      System.out.println("NumberFormatException => " + e1.getMessage());
    }
    
    catch (IndexOutOfBoundsException e2) {
      System.out.println("IndexOutOfBoundsException => " + e2.getMessage());
    }

  }
}

class Main {
  public static void main(String[] args) {
    ListOfNumbers list = new ListOfNumbers();
    list.writeList();
  }
}

U ovome primjeru stvorili smo niz pod nazivom arr veličine 10. Budući da indeks niza počinje od 0, posljednji element niza je na arr[9]. Uočite izjavu:

arr[10] = 11;

Ovdje pokušavamo dodijeliti vrijednost indeksu 10. Zbog toga dolazi do IndexOutOfBoundException. Kada se dogodi izuzetak u bloku try:

  • Iznimka se baca (thrown ) na prvi blok catch. Prvi blok ulova ne obrađuje IndexOutOfBoundsException, pa se prosljeđuje u sljedeći blok ulova.
  • Drugi blok catch u gornjem primjeru je odgovarajući rukovatelj izuzetaka, jer obrađuje IndexOutOfBoundsException. Dakle, izvršava se.