Çökmek Yerine Bir İstisnayı Yakalamak
Bir şey ters gittiğinde Java'nın bir istisna fırlattığını ve yönetilmeyen bir istisnanın programınızı bir yığın izi (stack trace) ile durdurduğunu zaten biliyorsunuz. Bir try-catch bloğu, kontrolü ele almanın yoludur: riskli kodu try içine sararsınız ve eğer bir istisna fırlatırsa, Java çökmek yerine eşleşen catch bloğuna atlar.
10 / 0 istisnayı fırlattığı anda, try bloğunun geri kalanı atlanır ve kontrol catch'e geçer. catch bittikten sonra yürütme normal şekilde devam eder; program ölmez.
catch Değişkeni İstisnayı Tutar
catch (ArithmeticException e) içindeki e gerçek bir nesnedir. Neyin yanlış gittiğine dair bilgi taşır; en faydalısı bir mesajdır:
e.getMessage() kısa bir açıklama döndürür. Hata ayıklama sırasında e.printStackTrace(), istisnanın tam olarak nereden geldiğini gösteren tam izi döker; bir mesaj tek başına nedeni bulmaya yetmediğinde buna başvurun.
Her Şeyi Değil, Belirli Türü Yakalayın
Bir catch bloğu yalnızca bildirdiği türe (veya bir alt sınıfa) uyan istisnaları yakalar. En büyük acemi hatası, bir sorunu "yok etmek" için Exception yakalamaktır:
// Bunu yapmayın - gerçek hataları gizler
try {
doWork();
} catch (Exception e) {
// NullPointerException, yazım hataları, mantık hataları... her şeyi yutar
}
Gerçekten yönetebileceğiniz en dar türü yakalayın. Hatalı sayı girişi bekliyorsanız NumberFormatException yakalayın. Öngörmediğiniz her şeyin yayılmasına izin verilmeli ki bozuk bir durumda sessizce devam etmek yerine ondan gerçekten haberdar olun.
Birden Fazla İstisna Türünü Yönetmek
Birden fazla catch bloğunu üst üste koyabilirsiniz. Java bunları yukarıdan aşağıya kontrol eder ve eşleşen ilkini çalıştırır, bu yüzden en belirliden en geneline doğru sıralayın:
İki tür aynı işlemi paylaştığında, bloğu çoğaltmak yerine | ile tek bir multi-catch kullanın:
Dikkat edilmesi gereken bir nokta: daha genel bir tür, belirli olanlardan sonra gelmelidir. catch (Exception e) bloğunu en başa koymak, sonraki daha belirli blokları ulaşılamaz hale getirir ve derleyici bunu reddeder.
finally Her Zaman Çalışır
Bir finally bloğu, ne olursa olsun try ve varsa catch'ten sonra çalışır; başarı, yakalanan bir istisna ya da hatta erken bir return. Her zaman gerçekleşmesi gereken temizliğin yeri burasıdır.
İstisna fırlasa da fırlamasa da "Closing resource" yazdırılır. Ancak finally içinden return yapmaktan kaçının; bu, bir istisnayı sessizce atabilir veya try bloğundan döndürülen bir değeri geçersiz kılabilir.
try-with-resources İşleri Sizin Yerinize Kapatır
Kapatılması gereken bir şeyle çalışırken (bir dosya, bir ağ bağlantısı, bir veritabanı ifadesi), bunu try (...) içinde bildirmek, bir istisna fırlatılsa bile blok bittiğinde onu otomatik olarak kapatır. AutoCloseable arabirimini uygulayan her tür çalışır.
Bu, try içinde açıp finally içinde kapatma şeklindeki eski deseni değiştirir ve daha az hataya açıktır çünkü kapatmayı unutamazsınız. Kapatılabilir bir kaynakla uğraşırken her zaman bunu tercih edin.
İstisnaları Normal Akış Kontrolü İçin Kullanmayın
try-catch, sıradan koşullar için değil, istisnai durumlar içindir. Bir istisnayı yakalamak, basit bir kontrolden daha pahalıdır ve kodu okumayı zorlaştırır. Koşulu önceden test edebiliyorsanız, bunun yerine onu yapın:
// Kaçının: eksik bir anahtarı test etmek için catch kullanmak
try {
process(map.get(key).trim());
} catch (NullPointerException e) {
// eksik anahtarı yönet
}
// Tercih edin: açıkça kontrol edin
String value = map.get(key);
if (value != null) {
process(value.trim());
}
catch'i gerçekten kontrolünüz dışındaki şeyler için ayırın: hatalı kullanıcı girişi, eksik dosyalar, ağ arızaları.
Sırada: NullPointerException
Java'da yakalayacağınız (ve neden olacağınız) en yaygın istisna NullPointerException'dır; null olduğu ortaya çıkan bir şey üzerinde bir metot çağırdığınız anda ortaya çıkar. Sırada, onu tam olarak neyin tetiklediğini, yığın izini nasıl okuyacağınızı ve onun baştan oluşmasını engelleyen alışkanlıkları derinlemesine inceleyeceğiz.
Sıkça Sorulan Sorular
Java'da try-catch nasıl kullanılır?
İstisna fırlatabilecek kodu bir try bloğunun içine koyun, ardından yönetmek istediğiniz istisna türünü belirten bir catch bloğu ekleyin: try { risky(); } catch (IOException e) { ... }. try içindeki kod eşleşen bir istisna fırlatırsa, Java çökmek yerine doğrudan catch bloğuna atlar. Değişken (e), istisna nesnesini tutar; böylece mesajını e.getMessage() ile okuyabilirsiniz.
Java'da finally bloğu ne işe yarar?
Bir finally bloğu, ne olursa olsun try/catch'ten sonra çalışır; kod başarılı olsa da, istisna fırlatsa da, hatta erken return yapsa da. Bir dosyayı kapatmak veya bir kilidi serbest bırakmak gibi her zaman gerçekleşmesi gereken temizlik işlemlerinin yeridir. Kaynakları kapatmak için ise try-with-resources genellikle daha temizdir çünkü onları otomatik olarak kapatır.
Exception mı yoksa belirli bir istisna türünü mü yakalamalısınız?
Gerçekten yönetebileceğiniz en belirli türü yakalayın. Exception (ya da daha kötüsü Throwable) yakalamak, NullPointerException gibi hatalar dahil her sorunu yutar ve gerçek nedeni gizler. Beklediğiniz buysa NumberFormatException yakalayın ve beklenmedik istisnaların yayılmasına izin verin ki onlardan haberdar olun.