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
nullreferans ü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
catchbloğ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
}
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,StackOverflowErrorgibi- Zorunlu olarak yakalanmaları gerekmez (checked değiller)
Exception
İki ana gruba ayrılır:
Checked Exceptions
Exceptionalt türüdür, fakatRuntimeExceptionalt türü değildir.- Derleyici tarafından kontrol edilir.
- handle-or-declare kuralına tabidir.
- Örnek:
IOException,SQLException,FileNotFoundException
Unchecked Exceptions (Runtime Exceptions)
RuntimeExceptionve 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
}
}
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.
tryiçinde riskli kod,catchiçinde hata yönetimi yapılır.finallybloğ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:
RuntimeExceptionve alt türleri ileErrortü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.