Java Exception Nedir? Exception Türleri

Share

Java’da kontrol altına alınabilen hatalara Exception ismi verilir. Bu yazıda, exception nedir, exception tüleri, checked (compile-time), unchecked (run-time) exception, exception handling, exception metodları, exception oluşturma ve fırlatma gibi pek çok konuya değineceğiz.

Java Exception Nedir?

Exception, program çalıştığı esnada ortaya çıkan, beklenmeyen ve öngörülemeyen hatalara verilen isimdir. Bu hatalar, program akışını sonlandırarak normal bir biçimde çalışmasına mani olur. Exception’ları Error dediğimiz diğer hatalardan ayıran en büyük özellikleri, handle edilebilmeleridir. Yani bu tür hatalar, programcılar tarafından belirli kodlarla idare edilebilir ve kontrol altına alınabilirler. Bu da programın belirlenen senaryolarla çalışmasına devam ettirmesini mümkün kılar.

Java’da bir exception durumu oluştuğunda, sistem bir  exception objesi oluşturur. Bu obje, yaşanan hata ile ilgili detaylı bilgiler içerir. Bu bilgiler arasında, exception ismi ve açıklaması gibi bilgiler yer alır. Java’da bir exception çok farklı sebeplerden ötürü ortaya çıkabilir. Bu sebepler arasında,

  • Kullanıcı tarafından girilen hatalı veri
  • İnternet kesintileri
  • Kod hataları
  • Erişilemeyen veriler
  • Cihaz ve bellek ile ilgili problemler vs. vardır.

Exception Türleri

Java’daki tüm Exception ve Error türleri, Throwable isimli parent class’ın subclass’ları konumundadır. Exception class’ının altında ise iki ana alt sınıf bulunur. Bu sınıflar Checked Exception ve Unchecked Exception’lardır.

Checked Exception

Aynı zamanda Compile-Time Exception olarak isimlendirilen Checked Exception’lar, compile-time sırasında compiler tarafından check edilen, kontrol edilen exception’lardır. Yani bu hatalar, kod yazıldığı esnada tespit edilir ve programcıya bildirilir. Programcının bu tür hataları gözardı etmesi mümkün değildir.

Unchecked Exception

Beklenmeyen, öngörülemeyen, program çalışmadan kontrol edilemeyen exception’lara Unchecked Exception ismi verilir. Bu tür exception’lar runtime exception olarak da isimlendirilirler. Bunun sebebi, bu hataların compile-time’da değil runtime’da yani program çalıştığı esnada ortaya çıkmasıdır.

public class Ornek {

    public static void main(String[] args) {
       int a = 10;
       int b = 0;
        System.out.println(a/b);
        
    }
}

// Bir sayı 0’a bölünemeyeceği için çıktı aşağıdaki gibi olur

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at practiceAdvanced.practice10.Ornek.main(Ornek.java:13)

//Bu işlemde sistem, matematiksel işlemler için oluşturulan ArithmeticException fırlatır.
//Bu hata, program çalışana kadar Java tarafından öngörülemez. 
// Program çalıştığı zaman ortaya çıkar. Bu yüzden runtime (unchecked) exception olarak isimlendirilir.  

Exception Handling Nedir?

Detaylı Bilgi İçin: Java Exception Handling Nedir? Nasıl Yapılır? try-catch-finally Kullanımı

Exception handling, yukarıdaki izah ettiğimiz hataların, programcı tarafından idare edilmesi, kontrol altına alınmasıdır. Java’da bir exception’ın handle edilmesinde try-catch-finally, throw-throws keyword’leri kullanılır. Bu kelimelerin izahları şu şekildedir.

Kelime Tanım
try{} “try” anahtar kelimesi, yapılacak işlemin ekleneceği kod blokuna verilen isimdir. try tek başına kullanılamaz. catch veya finally ona eşlik etmek durumundadır.
catch(){} “catch”, ortaya çıkabilecek hatayı yakalamak için kullanılır. catch parantezine exception class ismi referans obje adı, kod blok’unun içerisine ise, exception durumunda çalışacak kodlar yazılır.
finally{} Exception olsa da olmasa da çalıştırılacak olan kodların yazıldığı bölümüdür. Her iki durumda da muhakkak çalışır.
throw Bir exception fırlatmak için kullanılır.
throws Bir veya birden fazla exception’ı bildirmek için metod signature’da kullanılır.
   public static void main(String[] args) {
       int a = 10;
       int b = 0;
       try {
           System.out.println(a / b);
       }catch (ArithmeticException e){
           System.out.println("Bir Sayı 0'a Bölünemez" + e.getMessage());
       }

    }

En Sık Karşılaşılan RunTime (Unchecked) Exception’lar

Programcılar tarafından en sık karşılaşılan runtime exception’lar şunlardır;

  • ArithmeticException: Java matematiksel işlemler ile ilgili muhtemel tum istisna ve hataları ArithmeticException class’ına koymuştur. Dolayısı ile bir sayının sıfıra bölünmesi gibi matematiksel hatalarda, ArithmeticException fırlatılır.
  • NullPointerException: Java’da en çok karşılaşılan exception türlerinden bir tanesidir. Örneğin null bir değer sahip bir string’in length’i ölçmeye çalışan kod, NullPointerException verecektir.
  • ArrayIndexOutOfBoundsException: Array veya List’te bulunmayan bir index için işlem yapılmak istendiğinde Java ArrayIndexOutOfBoundsException hatası verir.
  • NumberFormatException: Sayı formatında olmayan bir String’i sayıya dönüştürmek istediğimiz Java, NumberFormatException hatası verir.
  • StringIndexOutOfBoundsException: Eğer bir String’den character/ler alırken olmayan bir index kullanılırsa, StringIndexOutOfBoundsException hatası verilir.
  • IllegalArgumentException: Genellikle throw yapmak için kullanılır. Geçersiz bir argüman girildiğinde, karşı tarafa IllegalArgumentException gönderilir. Örneğin yaş bilgisi negatif olarak girildiğinde, bu exception throw edilebilir.

Bunların dışında, ClassCastException, DateTimeException, ArrayStoreException, UnsupportedOperationException, NoSuchElementException, ConcurrentModificationException gibi farklı exception’lar da mevcuttur.

Exception Metodları

Exeption handle edilirken kullanılan bazı metodlar vardır. Bu metodlar, referans obje üzerinden kullanılır.

printStackTrace(): Bu metod, exception bilgilerini, oldukça detaylı bir şekilde ekrana yazdırır. Herhangi bir print işlemi yapmaya gerek yoktur. Zaten kendisi bir print işlemi yapar.

toString(): Bu metod, exception ismini ve exception’un sebebini return eder. Ekrana yazdırmak için print edilmesi gerekir.

getMessage(): Yalnızca exception’un açıklamasını return eder. print edilmesi gerekir.

Java’da Kendi Exception Class’larımızı Oluşturma

Java’da kendi exception class’larımızı oluşturup bunları herhangi bir yerde kullanabiliriz. Tek yapmamız gerken kendi exception ismimizle bir class oluşturmak ve onu checked veya unchecked exception class’larından birine extend etmek olacak. Oluşturduğumuz bu class, extends ettiğimiz class’ın child’ı olacak ve onun metotlarını miras alacak ve onun gibi hareket edecektir. Aynı şekilde bu class içerisinde istediğimiz metodu override ederek kullanabileceğiz.

Bu tür exception’lara Custom Exception ismi verilir. Bir exception, extends edildiği sınıfa göre, checked veya unchecked exception olabilir.

public final class OrnekException extends ArithmeticException{

    public OrnekException(String message){
        super(message);
    }

    @Override
    public void printStackTrace() {
        System.out.println("Ornek Exception Class“);
    }
}

Exception Fırlatma (throw)

Detaylı Bilgi İçin: throw vs throws | Farkları ve Kullanımları

Programcı farklı sebeplerle, belirli koşullar altında hata fırlatabilir. Bu işlem throws kelimesi ile yapılır. throw kelimesi kullanılarak hem checked hem de unchecked hatalar fırlatılabilir.

Author