🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-16: Exception Handling (Hata Yönetimi) 🚨

Konu Özeti

Java'da Exception Handling (Hata Yönetimi) mimarisi, programın çökmesini engellemek ve beklenmeyen durumları yönetmek için kullanılır. Throwable hiyerarşisi altında Error ve Exception sınıfları bulunur; Exception, Checked ve Unchecked (RuntimeException) olarak ikiye ayrılır. try-catch-finally blokları ile hatalar yakalanır, throw ve throws anahtar kelimeleriyle manuel istisna fırlatma ve metot bildirimi yapılır. Ayrıca, özel iş mantığı hataları için Exception sınıfından türetilen Custom Exception sınıfları oluşturulabilir.

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-16: Exception Handling (Hata Yönetimi) 🚨

Selamlar! Serimizin 16. bölümüne hoş geldiniz.

Önceki bölümde Key-Value mimarisini, `HashMap`, `LinkedHashMap` ve `TreeMap` sınıflarını ve Map üzerindeki gezinme yöntemlerini incelemiştik. Bu bölümde ise uygulamalarımızın çökmesini (crash) engelleyen, beklenmeyen durumları zarifçe yönetmemizi sağlayan **Exception Handling (Hata Yönetimi)** mimarisini öğreneceğiz.

---

📌 1. Exception (İstisna) Nedir ve Neden Yönetilmelidir? 🛑

Bir program çalışırken (runtime) mantıksal veya sistemsel bir aksaklık nedeniyle akışın kesilmesine **Exception (İstisna)** denir.

Örnekler:
• Sıfıra bölme yapmaya çalışmak (`ArithmeticException`)
• Var olmayan bir dosyayı açmaya çalışmak (`FileNotFoundException`)
• `null` olan bir referans üzerinden metot çağırmak (`NullPointerException`)
• Dizinin boyutunu aşan bir indekse erişmek (`ArrayIndexOutOfBoundsException`)

Eğer bu istisnalar yakalanmazsa (catch edilmezse), program anında durur ve kullanıcıya çirkin bir hata yığını (StackTrace) gösterilir. Hata yönetimi, programın çökmeden çalışmaya devam etmesini veya kullanıcıya anlamlı bir mesaj sunulmasını sağlar.

---

🏛️ 2. Java Hata Hiyerarşisi (Throwable Sınıfı) 🌳

Java'da tüm hataların ve istisnaların anası **`java.lang.Throwable`** sınıfıdır. İki ana dala ayrılır:

1. **`Error`:** Sistem düzeyindeki ölümcül hatalardır (Örn: `OutOfMemoryError`, `StackOverflowError`). Kod ile **yakalanmamalı ve müdahale edilmemelidir.**
2. **`Exception`:** Uygulama düzeyinde oluşan ve yazılımcı tarafından yönetilebilen durumlardır. İkiye ayrılır:

### A. Checked Exceptions (Derleme Zamanı / Kontrollü Hatalar):
Derleyicinin (`javac`) önceden fark ettiği ve kod yazılırken `try-catch` içine alınmasını veya `throws` ile bildirilmesini **ZORUNLU** kıldığı hatalardır.
• Örnek: `SQLException`, `IOException`, `ClassNotFoundException`

### B. Unchecked Exceptions / RuntimeExceptions (Çalışma Zamanı Hataları):
Derleyicinin zorunlu tutmadığı, genellikle yazılımcı mantık hatalarından kaynaklanan istisnalardır.
• Örnek: `NullPointerException`, `ArithmeticException`, `IllegalArgumentException`

---

🛠️ 3. `try-catch-finally` Blok Yapısı ⚙️

Hataları yakalamak ve yönetmek için `try-catch` blokları kullanılır.

Sözdizimi:
• **`try`:** Hata riski taşıyan kod bloğu buraya yazılır.
• **`catch`:** Hata oluşursa çalışacak bloktur. İlgili exception tipi parametre olarak alınır.
• **`finally`:** Hata oluşsa da oluşmasa da **HER DURUMDA** mutlaka çalışan bloktur (Dosya veya veritabanı bağlantılarını kapatmak için idealdir).

### Örnek Kullanım:

public class Main {
public static void main(String[] args) {
System.out.println("Program Başladı...");

try {
int sayi1 = 10;
int sayi2 = 0;
int sonuc = sayi1 / sayi2; // ArithmeticException fırlatır!

System.out.println("Sonuç: " + sonuc); // Bu satır HİÇ ÇALIŞMAZ!
} catch (ArithmeticException e) {
System.out.println("HATA YAKALANDI: Bir sayı sıfıra bölünemez! ⛔");
System.out.println("Hata Detayı: " + e.getMessage());
} finally {
System.out.println("FINALLY BLOĞU: Temizlik işlemleri yapıldı. Her zaman çalışır!");
}

System.out.println("Program sorunsuz bir şekilde çalışmaya devam ediyor... 🚀");
}
}

---

🔀 4. Çoklu Catch (Multi-Catch) Blokları 🎛️

Tek bir `try` bloğu içinde farklı türde hatalar oluşabilir. Bu durumda birden fazla `catch` bloğu eklenebilir.

⚠️ **Kritik Kural:** Hata yakalanırken **özel (spesifik) hatalar en üste**, genel hatalar (`Exception`) **en alta** yazılmalıdır!

public class Main {
public static void main(String[] args) {
try {
int[] sayilar = {1, 2, 3};
System.out.println(sayilar[5]); // ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("HATA: Geçersiz dizi indeksi!");
} catch (NullPointerException e) {
System.out.println("HATA: Nesne referansı null!");
} catch (Exception e) {
// Tüm hataların üst sınıfı (Genel yakalayıcı)
System.out.println("Bilinmeyen bir hata oluştu: " + e.getMessage());
}
}
}

---

🚨 5. `throw` ve `throws` Anahtar Kelimeleri 🎯

• **`throw`:** Kod akışı sırasında **manuel olarak** bilinçli bir istisna fırlatmak için kullanılır (`throw new IllegalArgumentException("Hata");`).
• **`throws`:** Bir metodun imzasında (signature), metodun çalışırken fırlatabileceği istisnaları **çağıran yere bildirmek** için kullanılır.

import java.io.IOException;

public class Main {
// 'throws' ile bu metodun IOException fırlatabileceğini beyan ediyoruz
public static void yasaKONTROL(int yas) {
if (yas < 18) {
// 'throw' ile istisnayı kendimiz fırlatıyoruz
throw new IllegalArgumentException("Yaşınız 18'den küçük olduğu için kayıt olamazsınız!");
}
System.out.println("Kayıt Başarılı! 🎉");
}

public static void main(String[] args) {
try {
yasaKONTROL(15);
} catch (IllegalArgumentException e) {
System.out.println("Sistem Uyarısı: " + e.getMessage());
}
}
}

---

🏗️ 6. Özel Hata Sınıfı Yazma (Custom Exception) 🛠️

Kendi projenize özel iş mantığı hataları tanımlamak için `Exception` (Checked) veya `RuntimeException` (Unchecked) sınıfından türeyen özel sınıflar yazabilirsiniz.

### Özel Exception Sınıfı (`BakiyeYetersizException.java`):

public class BakiyeYetersizException extends Exception {
public BakiyeYetersizException(String mesaj) {
super(mesaj);
}
}

### Kullanımı (`Main.java`):

public class Main {
public static void paraCek(double bakiye, double miktar) throws BakiyeYetersizException {
if (miktar > bakiye) {
throw new BakiyeYetersizException("Çekilmek istenen miktar (" + miktar + " TL), mevcut bakiyeden (" + bakiye + " TL) büyük olamaz!");
}
System.out.println("Para çekme başarılı.");
}

public static void main(String[] args) {
try {
paraCek(1000.0, 1500.0);
} catch (BakiyeYetersizException e) {
System.out.println("Özel Hata Yakalandı: " + e.getMessage());
}
}
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Java Exception hiyerarşisini, Checked/Unchecked ayrımını, `try-catch-finally` mekanizmasını, `throw` / `throws` anahtar kelimelerini ve Custom Exception yazmayı öğrendik.

👉 **Bölüm 17'de Bizi Ne Bekliyor?**
• Modern Java Özelliği: **Generics (Jenerik Yapılar)** 🧬
• Generics Nedir ve Tip Güvenliği (Type Safety)
• Jenerik Sınıflar (`Class<T>`) ve Jenerik Metotlar
• Bounded Types (Sınırlandı
rılmış Tipler: `<T extends Number>`)
• Wildcards (`?`, `? extends T`, `? super T`)

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! ☕✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,120Konular
3,298,249Mesajlar
326,305Kullanıcılar
Synex7807Son Üye
Üst Alt