Deo zbornika Učimo Javu

Hvatanje izuzetaka

try-catch blok

Pri izbacivanju izuzetka (exception throwing) ne dolazi do pucanja programa. Izbacivanja izuzetka je upozorenje na problem za koji se treba pobrinuti. Možemo to učiniti tako da naredbu koja odbacuje iznimku zatvorimo unutar try-catch bloka.

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

    try {
      System.out.println("Hello " + args[0]);
    }
    catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("Hello Whoever you are.");
    }

  }
}

Ukoliko pokrenemo program bez argumenata, imaćemo:

% javac HelloThere.java
% java HelloThere
Hello Whoever you are.

Rukovanje izuzecima

Što možemo učiniti s uhvaćenom iznimkom (izuzetkom)?

  • Riješiti problem i pokušati ponovo.
  • Izvesti neki drugi blok koda.
  • Izaći iz aplikacije pomoću metode System.exit()
  • Ponovno izbaciti iznimku.
  • Izbaciti novu (različitu iznimku).
  • Vratiti default vrijednost (ako metoda nije void).
  • Ne učiniti ništa i završiti metodu (ako je metoda void).
  • Ne učiniti ništa i nastaviti s metodom (ovo je rizično i rijetko kad opravdano; ima smisla samo ako možete garantirati da promatrani blok neće odbaciti iznimku ili da nekorektno izvršavanje naredbi unutar try bloka neće narušiti daljni kod).

Napomenimo da samo ispisivanje poruke o pogreški općenito nije prihvatljiv odgovor na pojavu iznimke.

Hvatanje višestrukih izuzetaka

Primer:

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

    int repeat;

    try {
      repeat = Integer.parseInt(args[0]);
    }
    catch (ArrayIndexOutOfBoundsException e) {
      //odabiremo default vrijednost
      repeat = 1;
    }
    catch (NumberFormatException e) {
      // ispisujemo poruku o pogreski
      System.err.println("Pokretanje: java ViseIzuzetaka broj" );
      System.err.println("npr. java ViseIzuzetaka 5" );
      return;
    }

    for (int i = 0; i < repeat; i++) {
      System.out.println("Zdravo");
    }

  }
}

Ako se pojavi iznimka čiji je tip naveden u nekom od catch blokova, ona će biti uhvaćena. Ako više catch blokova prepozna tip iznimke, obradit će ga prvi po redu. Rijetko se pokušava uhvatiti generički Error ili Throwable jer za takvom općenitom iznimkom je teško počistiti nered.

Izvor: Elliotte Rusty Harold, Java Lecture Notes, preveo Draško Budin, priredio Damjan Pavlica.