Java Exception Nedir? try-catch-finally, Checked/Unchecked

Bu yazımızda exception kavramını, try-catch-finally yapısını, exception hiyerarşisini ve sık kullanılan exception türlerini anlatıcağız.

1. Exception Nedir?

Java’da exception, normal program akışını bozan istisnai bir durumdur. Donanım hataları, kaynak eksikliği veya programlama hataları gibi durumlarda Java bir istisna “fırlatır” (throw) ve uygun bir “exception handler” (catch) bunu yakalar.

Örneğin:

  • Var olmayan bir dosyayı açmaya çalışmak
  • Bir dizide geçersiz index kullanmak
  • null referans üzerinden metot çağırmak
  • Sıfıra bölme işlemi yapmaya çalışmak

Bu durumlar, programın aynı şekilde devam etmesini engellediği için exception olarak ele alınır.

2. try – catch Yapısı

Exception handling’in temel yapısı try ve catch bloklarıdır. try içinde “riskli” kod bulunur; bir hata oluşursa akış catch bloğuna sıçrar.

try {
    // Riskli kod: örneğin dosya açma, ağ erişimi, parsing vb.
} catch (SomeException e) {
    // Hata yakalandığında yapılacaklar
}
  • try bloğu : “guarded region” – exception oluşabilecek kodlar
  • catch bloğu : Belirli bir exception türünü yakalar
  • Birden fazla catch bloğu art arda yazılabilir

Spesifikten Genele Sıralama

Bir exception hiyerarşisinde, önce daha spesifik tür, sonra daha genel tür yakalanmalıdır:

try {
    // IO ile ilgili riskli işler
} catch (FileNotFoundException e) {
    // En spesifik: dosya bulunamadı
} catch (IOException e) {
    // Daha genel: diğer IO hataları
}

Tam tersi sırada yazılırsa (önce IOException, sonra FileNotFoundException) derleme hatası olur, çünkü genel olan zaten alt türü de yakalamış olur.

3. finally Bloğu

finally, ister exception olsun ister olmasın, normalde her zaman çalışan bloktur. Kaynak temizleme (dosya kapatma, soket kapatma, bağlantı serbest bırakma vb.) için ideal yerdir.

try {
    // riskli kod
} catch (IOException e) {
    // hata yönetimi
} finally {
    // her durumda çalışacak temizlik kodu
}
Özet: Exception fırlatılırsa da, fırlatılmazsa da, hatta return ifadesi olsa bile finally normal akışta mutlaka çalışır. (Sadece System.exit() gibi JVM’i durduran durumlar hariç.)

4. Exception Propagation (Çağrı Yığını Boyunca Yükselme)

Bir metotta exception yakalanmazsa, çağrı yığını (call stack) boyunca bir alt metoda “doğru düşer”. Bu sürece exception propagation denir.

class TestEx {
    public static void main(String[] args) {
        doStuff();
    }

    static void doStuff() {
        doMoreStuff();
    }

    static void doMoreStuff() {
        int x = 5 / 0; // ArithmeticException
    }
}

Bu kod çalıştığında ArithmeticException fırlatılır ve hiç bir yerde yakalanmadığı için program sonlanır, stack trace ekrana yazılır. Exception, doMoreStuff()doStuff()main() hattından geçip en altta patlar.

5. Exception Sınıf Hiyerarşisi

Java’daki temel hiyerarşi şöyledir:

Object
 └── Throwable
      ├── Error
      └── Exception
           ├── RuntimeException
           └── (diğer checked exception sınıfları)

Error

  • Programcının genellikle toparlayamayacağı ciddi durumlar
  • OutOfMemoryError, StackOverflowError gibi
  • Zorunlu olarak yakalanmaları gerekmez (checked değiller)

Exception

İki ana gruba ayrılır:

Checked Exceptions

  • Exception alt türüdür, fakat RuntimeException alt türü değildir.
  • Derleyici tarafından kontrol edilir.
  • handle-or-declare kuralına tabidir.
  • Örnek: IOException, SQLException, FileNotFoundException

Unchecked Exceptions (Runtime Exceptions)

  • RuntimeException ve alt sınıfları
  • Derleyici tarafından bildirimi zorunlu değildir.
  • Örnek: NullPointerException, ClassCastException, ArithmeticException

6. Handle-or-Declare Kuralı (catch or declare)

Checked exception fırlatabilen bir metot, ya onu try/catch ile yakalamalı ya da imzasında throws ile bildirmelidir.

void doMore() throws IOException {
    // IOException fırlatabilecek kod
}
void doStuff() {
    doMore(); // <-- Burada derleyici hata verir, çünkü IOException 
              //    ne yakalanmış ne de bildirilmektedir.
}

Doğru kullanım örneği:

void doStuff() throws IOException {
    doMore(); // checked exception'ı biz de bildiriyoruz
}

Veya:

void doStuff() {
    try {
        doMore();
    } catch (IOException e) {
        // Exception burada handle ediliyor
    }
}
Not: RuntimeException ve Error türleri unchecked’tir, bu yüzden derleyici bunlar için handle-or-declare kuralını zorunlu tutmaz.

7. throw ile Exception Fırlatma

Exception’ları kendimiz de manuel olarak fırlatabiliriz:

void parse(String s) throws NumberFormatException {
    if (!isValidNumber(s)) {
        throw new NumberFormatException();
    }
}

Eğer fırlattığımız exception checked ise, metot imzasında throws ile bildirmek zorundayız.

8. Sık Kullanılan Exception ve Error Türleri

Tür Açıklama Kaynak
ArrayIndexOutOfBoundsException Diziye geçersiz index ile erişildiğinde JVM
ClassCastException Yanlış türde cast yapıldığında JVM
IllegalArgumentException Metoda beklenmeyen formatta argüman gönderildiğinde Programcı
IllegalStateException İşlem yapılmak istenen ortam/nesne yanlış durumdaysa Programcı
NullPointerException null referans üzerinden erişim yapıldığında JVM
NumberFormatException String sayıya çevrilemediğinde (örn. Integer.parseInt) Programcı
AssertionError assert ifadesi false olduğunda Programcı
ExceptionInInitializerError static blok veya static değişken başlatılırken hata olursa JVM
StackOverflowError Genellikle çok derin/sonsuz recursive çağrılarda call stack dolunca JVM
NoClassDefFoundError Gerekli bir sınıf .class dosyası bulunamadığında JVM

9. Özet

  • Exception, normal akışı bozan istisnai durumlardır.
  • try içinde riskli kod, catch içinde hata yönetimi yapılır.
  • finally bloğu, neredeyse her koşulda çalışır ve kaynak temizliği için idealdir.
  • Checked exceptions için “handle or declare” (catch or declare) kuralı geçerlidir.
  • Unchecked exceptions: RuntimeException ve alt türleri ile Error türleri.
  • Sık görülen exception türlerini ve ne zaman atıldıklarını bilmek, hem günlük kod yazımında kritik önemdedir.

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Java ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *