Android Dünyası

101 Android 101 Eğitimi

try/catch/finally Yapısı

Yazar: Geleceği Yazanlar Ekibi java try java catch java finally

 

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.


Örnek Exception Türleri
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.