try/catch/finally yapısının kullanılışı şöyledir:
try
{
//hesaplanmak istenen ifade
}
catch
{
//Bir hata türü tespit edilince verilmesi gereken mesaj
}
catch
{
//başka Bir hata türü tespit edilince verilmesi gereken mesaj
}
finally
{
//her durumda çalıştırılacak olan kod parçası
}
Yukarıdaki yapıyı şöyle açıklayabiliriz:
try bloğu içinde hesaplanacak ifade yer alır. Bu ifadenin hesaplanmasında bir hata oluşmamışsa, catch blokları atlanarak programın çalışması finally bloğu ile devam eder ve daha sonra programın bu bloğu izleyen kısmına geçilir.
try bloğu içindeki işlemde bir hata oluşmuşsa, catch bloklarından hangisi bu hatayı algılayabiliyorsa o catch bloğu içine girilir ve gerekli hata mesajı yazdırılır. Daha sonra program finally bloğu ile yukarıda açıklandığı biçimde çalışmaya devam eder.
NOT: finally bloğu ne olursa olsun çalışacağından burada genellikle try bloğu içinde bellek hatalarına (memory leak gibi) ya da açık kalmış bağlantılara yol açabilecek değişkenler yok edilri.
Şimdi basit bir örnekle try/catch bloklarını açıklayalım:
public class Main {
public static void main(String[] args) {
try {
int a = 42 / 0;
} catch (ArithmeticException MatematikselHata) {
System.out.println(" İşlem yapılırken matematiksel bir hata oluştu :" + MatematikselHata.getMessage());
}
}
}
Burada ArithmeticException programda herhangi bir aritmetiksel hata olduğunda sistemin yanıtıdır. Örnek kodumuzda ArithmeticException Matematiksel hata olarak aktarılmış bu da dışarıya output olarak verilmiştir.
try/catch/finally yapısında kullanırken alınabilecek exception türleri aşağıdadır. Yapılan programa göre hangi hata durumlarında programınızın nasıl tepki vereceğine karar verebilirsiniz.
Hata Tipleri | Hatanın Anlamı |
---|---|
ArithmeticException | Aritmatiksel bir işlem sırasında oluşan hata |
ArrayIndexOutOfBoundsException | Array sınırlarından çıkılma hatası |
ArrayStoreException | Array yapısına uymayan bir değer kaydedilmeye çalışıldığında |
ClassCastException | Uygunsuz class atama işlemi |
IllegalArgumentException | Uygun olmayan argüman kullanımı |
IllegalMonitorStateException | Uygun olmayan monitör işlemi |
IllegalStateException | Sistemin uygun pozisyonda olmadığını belirtir |
IllegalThreadStateException | Tread durumunun uygun olmadığını belirtir |
IndexOutOfBoundsException | Index'in sınırlardan çıkılma hatası |
NegativeArraySizeException | Array'in boyutuna negatif değer verilmiş olması hatası |
NullPointerException | Boş pointer hatası |
NumberFormatException | Uygun olmayan sayı formatı hatası |
SecurityException | Güvenlik hatası |
StringIndexOutOfBounds | String yapısının sınırlarından çıkma hatası |
UnsupportedOperationException | Desteklenmeyen işlem hatası |
ClassNotFoundException | Class bulunmama hatası |
CloneNotSupportedException | Çoğalmaya çalışılan bir objenin çoğalamayacağını belirten hata |
IllegalAccessException | Uygunsuz erişim hatası |
InstantiationException | Bir objenin oluşturulması esnasında oluşan hata |
InterruptedException | Bir tread'in diğer tread'i durdurma hatası |
NoSuchFieldException | Aranılan alanın olmadığı hatası |
NoSuchMethodException | Kıllanılan methodun bulunmama hatası |
Şimdi başka bir örneğe göz atalım:
package com.turkcell.and101;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class ExceptionOrnek1 {
public static void main(String[] args) {
String str = "Bunu dosyaya yazdir";
File file = new File("dosya.txt");
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(file, false);
fileWriter.write(str);
}
catch (IOException dosyaHatasi) {
dosyaHatasi.printStackTrace();
}
finally {
try {
if (fileWriter != null)
fileWriter.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
Yukarıda basit bir dosya okuma işlemi görüntülenmektedir. Burada fileWriter değişkeni bir dosyaya erişim açar ve write komutu ile str değişkeni dosyanın içerisine yazılır. write komutu diske yazma yapamaması durumunda bir IOException (Input Output - Giriş Çıkış) hatası fırlatır ve biz de bunu catch bloğu içerisinde yakalarız.
NOT: printStackTrace metodu hatanın detaylı bir şekilde konsola yazılmasını sağlar.
catch bloğu içerisinde yazma işlemi gerçekleşmese bile dosya ile erişimin devam etmesi ihtimali programımızın ciddi bir soruna yola açmasını sağlayabilir. Bu yüzden dosya yazma işlemi olmasa da bizim dosya bağlantısını mutlaka kapatmamız gerekir. İşte bu yüzden finally bloğu içerisinde close metodunu çalıştırırız ve eğer yazma işlemi gerçekleşmese de dosya ile bağlantıyı kesmiş oluruz. Burada null kontrolü yapılmasının sebebi fileWriter değişkeninin null olabilme ihtimalidir.
NOT: Dosya yazma ile ilgili geniş bilgi bir sonraki bölümde anlatılacaktır.
Kendi hatalarımızı oluşturma
Program içerisinde kendi hazırladığımız sınıf ve metodlar zaman zaman bize özgü hatalar fırlatabilirler. Bunu sağlamak için kendimize ait bir hata sınıfı oluşturabiliriz. Java Exception sınıfı extend edilebilir bir sınıf olduğundan aşağıdaki gibi bir hata sınıfı hazırlanabilir:
package com.turkcell.and101;
public class OzelException extends Exception {
private static final long serialVersionUID = 1L;
@Override
public String getMessage() {
return "Benim hatam olustu.";
}
}
Yukarıdaki örnekte MyException adında bir hata sınıfı oluşturduk ve getMessage metodunu değiştirdik. Şimdi bu hatayı fırlatan bir metod hazırlayalım ve uygulamada bu hatayı yakalayalım:
package com.turkcell.and101;
public class ExceptionOrnek2 {
public static void main(String[] args) {
try {
hataFirlatir();
}
catch (OzelException e) {
System.out.println(e.getMessage());
}
}
public static void hataFirlatir() throws OzelException {
throw new OzelException();
}
}
Hazırladığımız hataFirlatir adlı metod az önce oluşturduğumuz OzelException hatasını throw komutuyla ile fırlatıyor. Derleyici ise bu metodun bir hata fırlattığını throw sözcüğüyle anlıyor. main metodu içinde hataFirlatir çağırıldığında OzelException hatasının mutlaka yakalanması gerekiyor ve getMessage metodu konsola “Benim hatam oluştu” mesajını veriyor.
Profesyonel uygulamaların çoğunda, hazırlanan servisler kullanılırken bir hata oluştuğunda bunu diğer sınıflara belirtmek için özel hata sınıfları hazırlanır. Bu konuya diğer bölümlerde tekrar değineceğiz.