Java - Hvatanje više izuzetaka (catch Multiple Exceptions)


Prije Jave 7 morali smo napisati više kodova za rukovanje izuzecima za različite vrste izuzetaka, čak i ako je postojala redundantnost koda. Pogledajmo primjer:


Primjer 1: Više blokova catch

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException e) {
      System.out.println(e.getMessage());
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    } 
  }
}

U ovom primjeru mogu se dogoditi dva izuzetka:

  • ArithmeticException, jer pokušavamo podijeliti broj s 0.
  • ArrayIndexOutOfBoundsException, jer smo deklarisali novi cjelobrojni niz s granicama polja od 0 do 9 i pokušavamo dodijeliti vrijednost indeksu 10.

Ispisujemo poruku izuzetka u oba bloka catch, tj. duplirani kod. Asocijativnost operatora dodjeljivanja = s desna na lijevo, pa se prvo izbacuje ArithmeticException s porukom / by zero.



Upravljajte s više izuzetaka u bloku catch

U Javi SE 7 i novijim verzijama sada možemo uhvatiti više od jedne vrste izuzetka u jednom bloku catch. Svaki tip izuzetka s kojim se blok catch može nositi odvojen je okomitom crtom |. Pogledajmo sintaksu:

try {
  // Kod
} catch (ExceptionType1 | Exceptiontype2 ex) { 
  // Blok catch 
}

Primjer 2: Višestruki blok catch

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

Hvatanje više izuzetaka u jednom bloku catch smanjuje dupliranje koda i povećava učinkovitost. Bajt kod generisan tokom sastavljanja ovog programa biće manji od programa koji ima više blokova catch, jer nema redundancije koda.



Baza hvatanja izuzetak

Prilikom hvatanja više izuzetaka u jednom bloku catch, pravilo se generisana na specijalizovano. To znači da ako postoji hijerarhija izuzetaka u bloku catch, možemo uhvatiti osnovni izuzetak samo umjesto hvatanja više specijalizovanih izuzetaka. Pogledajmo primjer:


Primjer 3: Hvatanje samo osnovne klase izuzetaka

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

Znamo da su svi izuzeci klase potklase klase Exception. Dakle, umjesto hvatanja više specijalizovanih izuzetaka, jednostavno možemo uhvatiti klasu Exception. Ako je osnovna klasa izuzetka već navedena u bloku catch, nemojte koristiti podređene klase izuzetka u istom bloku catch. U suprotnom ćemo dobiti grešku prilikom kompajliranja. Pogledajmo primjer:


Primjer 4: Hvatanje osnovnih i podređenih klasa izuzetaka

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

U ovom primjeru, ArithmeticException i ArrayIndexOutOfBoundsException su u potklase klase Exception. Dakle, dobijamo grešku prilikom kompajliranja.