İlginizi Çekebilir
Java Exception Handling
  1. Ana Sayfa
  2. Java
  3. Java Exception Handling Nedir?
Trendlerdeki Yazı

Java Exception Handling Nedir?

Hatasız bir kod yazma süreci neredeyse imkansız, ister istemez hatalar ile karşılaşabiliriz bu karşılaşacağımız hataları java exception handling kullanımı ile yakalayarak sorunumuzun nereden ve neden kaynaklı olduğunu öğrenebiliriz.

Java Exception Handling Nedir sorusunun cevabı basit bir şekilde verilebilir ama bu sadece buz dağının görünen kısmı olacaktır. Bu buz dağının görünmeyen kısmını sizlerle birlikte konun ilerleyen kısmında ve bu içeriğin devamında birlikte keşfediyor olacağız. 👀

Keşfimizin ilk aşaması olarak bizi bekleyen bu buzdağının tanımlamasını gerçekleştirerek başlayalım.

Java Exception Handling Nedir?

Java Exception Handling Nedir başlığımızı parçalara bölerek gidecek olursak, Exception kavramının Türkçe karşılığının istisnalar olarak yapıldığını görürüz. Handling kavramı ise işlemek, kullanmak gibi anlamlara gelmekte, bu anlamlar birleştirildiği zaman literatüre hata yakalama olarak geçiş sağlamıştır.

Peki, programlarımız içerisinde bu kavram neyi ifade ediyor diye soracak olursanız onunda açıklamasını kod blokları arasında oluşan anormal durumlar olarak yapabilirim. 🔦 Bu kavramı biraz daha açarak buz dağının keşfinde biraz daha derinlere inelim.

Her program oluşturulduğu zaman bazı hatalar ile karşılaşmamız olası bir hale gelir ve bu hata yapılarına göre kendi içlerinde ayrıştırılır. Bazı ortaya çıkan hataları Java sayesinde yakalamamız daha kolay bir haldeyken bazı hataları bizzat kendimizin kod bloklarını kurcalayarak bulmamız gerekebilir ve son olarak ise geri dönülemez, tamir edilmesi mümkün olmayan bazı hata tipleri ile karşılaşmamız mümkündür.

Bu exception türleri yukarıda belirttiğim gibi üç temel başlığa ayrılır bunlara aşağıdaki başlıkta göz attıktan sonra java exception handling işlemi için örnekler oluşturmaya başlayabiliriz.

Java Exception Türleri

Karşılaştığımız durumların yapısına göre alacağımız exception türlerini şu şekilde maddelendirebilirim:

  • Checked Exception (🤗): Programımızın temelinde meydana gelebileceği olası bir takım hatalar söz konusu oluyor ve bu kod satırını oluştururken program bize bir try-catch tanımlaması ya da throws açıklaması yapmamızı istiyorsa bu hata türüne Checked Exception denilir.Mesela ilerleyen konularımızda göreceğimiz JDBC ile veri tabanı bağlantısı kuracağımız zaman ya da bir dosyaya ulaşarak işlem yapmamız gerektiğinde kullanacağımız IOException, SqlException gibi kavramlar kullanmamız gerekir.
  • Unchecked Exception (😨): Yukarıdaki exception türünde yapmak istediğimiz işlemi java algılıyor ve bunun bir hata meydana getirebileceğini düşündüğü için önceden önlem alınmasını istiyordu fakat bu hata türümüzde java bizi bir tanımlama yapmaya zorlamıyor. Bu yapısı yüzünden de çoğu zaman geliştiricileri sinir krizine doğru götürebiliyor.Bu hata türüne örnek olarak programın vereceği RuntimeException veya bir değeri 0’a bölmeye çalışacağımız zaman verdiği ArithmeticException gibi örnekler verilebilir. Bu hata sonuçlarının çözümlerini bularak sonradan kendimizin müdahale etmesi gerekmektedir.
  • Error (😱): Hata türleri içerisinde belki de karşılaşmak istemeyeceğimiz tek hata türü error olabilir. Programın çalışma esnasında meydana gelecek OutOfMemoryError, StackOverFlowError gibi yapıların çözümü için yazmış olduğumuz kod satırlarını bazen baştan sona değiştirmemiz gerekebilir.

Artık karşılaşabileceğimiz exception türleri hakkında bir fikre sahip olduğumuza göre, yavaş yavaş bu exception türleri ile karşılaşacağımız hataları yakalayacağımız try-catch bloklarına yakından bakalım.

Java Exception Handling Avcısı Try-Catch Blokları

Hem bu başlığımızı daha iyi anlayabilmek hem de java exception handling nedir soruna daha iyi cevap verebilmek için bir unchecked exception örneği oluşturup bizi nasıl bir çıktı bekliyor kontrol edelim.

// Bir değişken tanımlayalım:
int a=100;
int b = 50;

// Hata ile karşılacağımız tanımlama (a/0): 
System.out.println("--------------\n-> Exception Karşılaşma Örneği: "+(a/0)+"\n-> İkinci İşlemimiz: "+(b++)+"--------------");

Kod Çıktısı:

java exception handling
Java exception türleri

Bir değeri 0’a bölmeye çalıştığımız zaman bir hata ile karşılaşacağımızı söylemiştim, bu örnek içinde bu işlemi gerçekleştirdik fakat her zaman karşılaşacağımız hatalar bu tarz basit veya açıklayıcı olmayacaktır. Bizim bu hataları yakalayabilmemiz ve log kaydı oluşturmak istediğimiz zaman try-catch bloklarını kullanmamız gerekir.

Java Try-Catch Bloğunun Kullanımı

Java Exception Handling kavramı içerisinde kullanacağımız try-catch bloklarını şu şekilde tanımlayabiliriz:

// Try-Catch Tanımlama Örneği:
try{
//kontrolü sağlanarak gerçekleştirilecek işlemlerimizi yazıyoruz.
}
catch(ExceptionTürü parametre){
//belirttiğimiz hata ile karşılaşıldığında yapılacak işlemi tanımlıyoruz.
}

Try-Catch tanımlaması hakkında bir fikrimiz olduğuna göre yukarıdaki örneğimizi tekrar ele alarak try-catch blokları içerisinde kodumuzu yazalım.

public class Main {
    public static void main(String[] args) {
        // Değişken Tanımlaması:
        int a=100, b=50, c=0;

        try{
            System.out.println("--------------\n-> Try Bloğu İçerisindeki İlk İşlemimiz (a+b) : "+(a+b)+"\n-> İkinci İşlemimiz ((a+b)/c) : "+((a+b)/c)+"\n--------------");

        }
        catch(ArithmeticException ae){
            System.out.println("--------------\n< Hata İle Karşılaştınız >\n--------------\n-> Hatanın Kodu: "+ae.hashCode()+"\n-> Hatanın Tanımı: "+ae+"\n--------------");
        }
    }
}

Kod Çıktısı:

Java Try-Catch Kullanımı Nasıl Yapılır
Java try-catch kullanımı

Java exception handling nedir sorusuna cevap olarak catch bloğundan bize geri dönen değerin yakalanması, hatanın kaynağını belirlememiz olarak söyleyebiliriz.

Try-Catch bloklarını oluşturacağımız zaman hata kontrolünün sağlanacağı hata türlerini ve genel exception sınıfı hakkında bilgi almak isterseniz buraya tıklayarak Oracle sayfasından daha detaylı bilgi alabilirsiniz.

Java Try-Catch Oluşma Aşamaları

  • Java’da exception (istisna, hata) meydana geldiği zaman ilk olarak bir nesne oluşturulur.
  • Ortaya çıkan bu hatayı yakalamak için bir catch bloğunun olup olmadığı kontrol edilir. Catch bloğu bulunuyorsa program sonlandırılmaz ve catch bloğundan devam eder.
  • Catch bloğu bulunmuyorsa, hatanın ortaya çıktığı komut satırına gelindiğinde oluşturulan nesne fırlatılır ve uygulama sonlandırılır.

Bu şekilde java exception handling için kullanacağımız try-catch bloğunun oluşma aşamaları hakkında bir fikre sahip olduk ama konuya başlarken söylediğim gibi bu olay buz dağının sadece bir kısmı. Buraya kadar öğrendiğimiz bilgilere ekstra olarak bir tanımlama gerçekleştirerek bu java exception handling avcısı hakkında daha detaylı bir fikre sahip olmaya çalışalım.

Java Try-Catch Finally Bloğu

Bir hata ile karşılaştığımızda ya da karşılaşmadığımızda standart olarak bir işlemin gerçekleştirilmesini isteyebiliriz. Bu işlemi try-catch yapısına ek olarak ekleyeceğimiz finally bloğu ile sağlayabiliriz. Bu yapının yazılışı hakkında örnek kod yazılışı şu şekilde olacaktır:

public class Main {
    public static void main(String[] args) {

        // Bu sefer bir dizi tanımlayalım:
        int [] dizi = {10,15,27,30,37};
        try{
            System.out.println("--------------\n< Dizi Elemanları >\n--------------");
            for(int i=0;i<= dizi.length;i++){
                System.out.println("-> Dizinin "+i+" indisindeki eleman: "+ dizi[i]);
            }
            System.out.println("--------------");
        }
        catch (Exception e){
            System.out.println("--------------\n< OOPS! ERROR >\n--------------\n -> Hata Mesajı: "+e.getMessage()+"\n--------------");
        }
        finally {
            System.out.println("-> Hata ile karşılaşsak ya da karşılaşmasak bile buradaki işlemler gerçekleştirilir.\n--------------");
        }
    }
}

Kod Çıktısı:

Java Finally Bloğu Nasıl Tanımlanır
Java finally bloğu tanımlaması

Kurmuş olduğumuz for döngüsü sonucunda dizi üzerinde bulunmayan bir indise ulaşmaya çalıştığımız için bir exception mesajı aldık. Bu döngüyü doğru bir şekilde kurmuş olsaydık da finally bloğu yine çalıştırılırdı.

Eğer aşağıda bulunan yorum yap kısmından belirtirseniz, try-catch bloğu hakkında daha detaylı örneklerin, tanımların bulunacağı yeni bir içerik hazırlayabilirim ama şuan konuyu fazla dağıtmadan java exception handling kavramında kullanılan throw ve throws kavramına göz atalım.

Java Throw ve Throws Kavramları

Yukarıda yaptığımız işlemlerin hepsinde bize fırlatılan hataları yakalayarak işlem yapmasını sağladık. Bu işlemleri büyük ölçekli işlerde veya yaptığımız programda ortaya çıkan hataların daha anlaşılır olması için kendi hata bloklarımızı oluşturabiliriz. Bu hata bloklarını oluştururken java’da kalıtım kavramını, throws ve throw kavramlarını kullanırız. Bu işlemleri koda dökerek şu şekilde anlatabiliriz:

#1 Öncelikle programımız içerisinde kullanacağımız bir exception sınıfı oluşturmalıyız. Bu işlem için SpecialException isminde bir sınıf oluşturarak işlemimize başlayalım.
#2 Ardından oluşturmuş olduğumuz bu sınıfa genel Exception sınıfından türetildiğine dair bir kalıtım işlemi uygulayalım. İşlemimizi gerçekleştirdikten sonra bir constructor metot tanımlaması ile istediğimiz mesajın atılacağı bir tanımlama gerçekleştirelim.

package com.company;

public class SpecialException extends Exception{
    public SpecialException(String exceptionMessage){
        super(exceptionMessage);
    }
}

#3 Bu işlemimizi yaptıktan sonra dosya okuması gerçekleştireceğimiz FileReader isminde bir sınıf tanımlaması gerçekleştirerek, kendi exception yapımızı oluşturalım.

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class FileReader {
    public void read (String fileName) throws SpecialException{
        try{
            FileInputStream fileInputStream = new FileInputStream(fileName);
        }
        catch(FileNotFoundException e){
            throw new SpecialException("[Özel Hata Mesajı] -> Dosya Bulunamadı.");
        }
    }
}

#4 Yapmış olduğumuz bu işlemi daha sonra tetiklemek için Main sınıfımıza giderek try-catch yapısında programımızı çalıştırabiliriz.

public class Main {
    public static void main(String[] args) {
        FileReader fileReader = new FileReader();
        try{
            fileReader.read("emrecelen.com.tr");
        }
        catch (SpecialException e){
            e.printStackTrace();
        }
    }
}

Kod Çıktısı:

Java Throw ve Throws Kavramları
Java throw ve throws kavramı

Java Exception Handling konusunda aklınıza takılan ya da konu işleyişi hakkında öneriniz, bu konu üzerinde örnekler oluşturmamı isterseniz aşağıda bulunan yorum yap kısmından benimle iletişime geçebilirsiniz.

Yorum Yap

Yazar Hakkında

Yazmayı, öğrenmeyi, öğrendiklerini paylaşmayı , kodlamayı ve günün birinde Yönetim Bilişim Sistemleri Uzmanı olmanın hayalini kuran birisiyim.

Yorum Yap