CodeBlanks Logo Icon CodeBlanks

Çoklu catch

Birden çok catch bloğunu öğrenirsin.

Birden fazla catch bloğu

Bir try'dan sonra birden fazla catch gelebilir. Her biri farklı istisna türünü yakalar. Sıra önemlidir: özel tür önce, genel tür sonra yazılır.

try {
  int n = Integer.parseInt(s);
  int r = 10 / n;
} catch (NumberFormatException e) {
  System.out.println("Sayı değil");
} catch (ArithmeticException e) {
  System.out.println("Sıfıra bölme");
}

Eğer genel türü önce yazarsan özel türler hiçbir zaman erişilemez olur ve derleme hatası alırsın. Bu yüzden Exception gibi genel türü en sona bırakmalısın. Her catch bağımsızdır; yalnızca biri çalışır.

Çoklu yakalama (multi-catch)

Java 7'den beri birden fazla türü tek catch'te yakalayabilirsin. Türler | ile ayrılır; bu yapıya multi-catch denir.

try {
  int n = Integer.parseInt(s);
} catch (NumberFormatException | ArithmeticException e) {
  System.out.println("Hata");
}

Multi-catch aynı işlemi yapan farklı türler için kod tekrarını önler. Ancak | ile ayrılan türler arasında alt-üst ilişkisi olamaz; hepsi kardeş olmalıdır. e değişkeni örtük olarak final'dir; içinde değiştirilemez.

Uygulama İki türü ayrı catch ile yakala

String s = "abc"; tanımla. try içinde Integer.parseInt(s) ve int r = 10 / n; yaz. İlk catch NumberFormatException yakalayıp Sayı değil yazsın; ikinci catch ArithmeticException yakalayıp Sıfıra bölme yazsın.

Başlangıç kodu

Main.java
public class Main {
  public static void main(String[] args) {
    String s = "abc";
    // parseInt ve bölmeyi dene, iki ayrı catch ile yakala
  }
}

Örnek çözüm

Main.java
try {
  int n = Integer.parseInt(s);
  int r = 10 / n;
  System.out.println(r);
} catch (NumberFormatException e) {
  System.out.println("Sayı değil");
} catch (ArithmeticException e) {
  System.out.println("Sıfıra bölme");
}

Beklenen çıktı

Sayı değil

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İkinci catch'i ekle

Soru
try {
  int n = Integer.parseInt(s);
} catch (NumberFormatException e) {
  System.out.println("Sayı değil");
} ____ (ArithmeticException e) {
  System.out.println("Sıfıra bölme");
}
Cevap
try {
  int n = Integer.parseInt(s);
} catch (NumberFormatException e) {
  System.out.println("Sayı değil");
} catch (ArithmeticException e) {
  System.out.println("Sıfıra bölme");
}

Açıklama: ikinci catch ilkine özel farklı türü yakalar.

2 Çoklu catch bloklarında sıralama nasıl olmalıdır?

  • Önce genel, sonra özel
  • Önce özel, sonra genel Doğru cevap
  • Yalnızca bir catch olur
  • Sıra önemli değildir

Açıklama: özel tür önce yazılır; genel tür sona bırakılır, aksi halde derleme hatası alınır.

3 Senaryoyu yakalama türüyle eşleştir

Kavram Anlamı
parseInt başarısız NumberFormatException
sıfıra bölme ArithmeticException
null nesne NullPointerException
dizi dışı ArrayIndexOutOfBoundsException

Başlangıç bölümündeki tüm dersler