Ekim 19, 2021
11 11 11 ÖÖ
TCP nedir ? Aktarım Katmanı 2
Aktarım Katmanı Tcp Nedir
Yönlendirme Nedir 2 ?
Yönlendirme Nedir ?
Ağ Katmanı Nedir 2 ?
Ağ Katmanı Nedir ?
Veri Bağı Katmanı Nedir 2 ?
Android Studio Nasıl Kurulur ?
Veri Bağı Katmanı Nedir ?
Fiziksel Katman Nedir ?
Son Yazılar
TCP nedir ? Aktarım Katmanı 2 Aktarım Katmanı Tcp Nedir Yönlendirme Nedir 2 ? Yönlendirme Nedir ? Ağ Katmanı Nedir 2 ? Ağ Katmanı Nedir ? Veri Bağı Katmanı Nedir 2 ? Android Studio Nasıl Kurulur ? Veri Bağı Katmanı Nedir ? Fiziksel Katman Nedir ?
java

İstisna Yönetimi (Exceptions)

Paylaşım , Takip İçin

İstisnalar (Exceptions) Nedir?

  • İstisnalar (Exceptions), kod blokları arasında oluşan anormal durumlardır.
  • Örneğin bir sayının sıfıra bölünmesi bir istisnai durumdur.
  • Bu gibi durumlarda derleyici çalışma zamanı hatası (runtime error) verecek ve program yapısı kırılacaktır.
  • Bu tip durumlarda Java’da hata yakalama nesnesi oluşturulur ve kontrol blokları ile hata göz ardı edilir yada farklı bir şekilde işlenir.
  • Java’da hata istisna yönetimi try-catch-finally blok yapıları kullanılarak gerçekleşir.
  • Bu söylediklerimizi bir örnekle ifade edelim.

Çalışma Zamanı Hatası Örneği (Runtime Error)

public class TryCatch {

  public static void main(String[] args) {

  //divided by zero Exception

    int a=0;

    double b = 40 /a;

    System.out.println("Değer b:" +b);

  }

}

Exception in thread “main” java.lang.ArithmeticException: / by zero

at TryCatch.main(TryCatch.java:7)

Derleyici Hata Yakalama

  • Örnekte de görülebileceği gibi derleyici bize sıfıra bölme hatası ile ilgili bir hata mesajı göstermektedir.
  • Mesaja dikkatli baktığımızda:

   java.lang.ArithmeticException

ifadesini ve hatanın meydana geldiği satır numarasını (TryCatch.java:7) görebiliriz.

  • Yazmış olduğunuz kodlarda meydana gelebilecek hatalar her zaman bu kadar kolay anlaşılır olmayabilir. Bu nedenle hata çıkabilecek kod parçacıklarını try-catch blokları içerisinde yazmamız iyi bir çözümdür.

try-catch’i Kullanmak

  • Her ne kadar Java size çalışma zamanı hatalarını ayıklasa da, genellikle istisnaları kendiniz işlemek istersiniz.
  • Bunu yaparak:
  • Hata gerçekleştiğinde düzeltilmesine izin verilir,
  • Programın otomatik olarak sonlanmasına engel oluruz.
  • Birden fazla catch bloğu kullanılabilir.
try {

    //istisna kontrolü kodu

}

catch(ExceptionTürü e) {

    //(ExceptionTürü) hata

    //alındığında çalışacak kod

}



finally {

    //hata alınsada alınmasada

    //çalışacak kod

}

Örnek

public class TryCatch {

  public static void main(String[] args) {

    //divided by zero Exception

    int a=0;

    double b=0;

    try {

      //istisna kontrolü

      b = 40 / a;

    }

    catch(ArithmeticException e) {

      //Hata kontrolü

      System.out.println("Division by Zero");

    }

    finally {

      System.out.println("Değer b:" +b);

    }

  }

}

———————–

Division by Zero

Değer b:0.0

İstisna Nesneleri ve Açıklamasını Göstermek

  • Bir önceki örnekte vermiş olduğumuz catch bloğunun içerisinde iki bölüm mevcuttur.
  • İlk bölüm hatanın tipidir. Bu örnek için: ArithmeticException
  • İkinci bölüm ise nesnenin kendisi yani e.
  • Hatanın neden kaynaklandığı e nesnesinin içerisinde yer alır ve aşağıdaki metot ile ekrana yazılabilir.

e.toString();

  • Şimdi eğer catch metodu içerisinde tanımladığınız hata tipi ile karşılaştığınız hata tipleri uyuşmuyorsa hatayı yakalayamazsınız.
  • Hata tipini tam olarak bilmiyorsanız, genel hata tipi olan Exception kullanmak size kolaylık sağlayacaktır.

Örnek: Alttaki iki kod aynı işi yapıyor.

public static void main(String[] args) {

  //divided by zero Exception

  int a=0, b=0;

  try {

    b = 40 / a;

  }

  catch(Exception e) {

    System.out.println(e.toString());

  }

  System.out.println(İstisina sonrası”);

}

public static void main(String[] args) {

  //divided by zero Exception

  int a=0, b=0;

  try {

    b = 40 / a;

  }

  catch(ArithmeticException e) {

    System.out.println(e.toString());

  }

  System.out.println(İstisina sonrası”);

}

Exception en genel hata tipidir.

İki kodda aynı hatayı yakalayacaktır.

Dizilerde İndeks Taşma Hatası

public class ArrayOutOfIndex {

  public static void main(String[] args) {

    int[] array = new int[] {1, 2, 3, 4, 5};

    try {

      System.out.println("Try Bloğu");

      System.out.println("array[6]="+array[6]);

    }

    catch(ArrayIndexOutOfBoundsException e){

      System.out.println(e.toString());

      System.out.println("Dizi indeks hatası!");

    }

  }

}

—————————————

Try Bloğu

java.lang.ArrayIndexOutOfBoundsException: 6

Dizi indeks hatası!

Çoklu catch Blokları

  • Programda birden fazla hata olma ihtimali varsa, tüm ihtimaller kadar catch bloğu oluşturulabilir.
  • Java 7 ile beraber gelen bir değişiklik sayesinde birden fazla hata tipini tek bir catch bloğu ile kontrol edebilirsiniz.
  •  

catch(ArrayIndexOutOfBoundsException | ArithmeticException e)

  • Sonrasında programda dikkat edilmesi gereken nokta catch bloğunun ilk yakalanan exception için tetikleneceğidir.
  • try bloğu içerisinde yer alan diğer satırlardaki hatalar atlanacağından catch bloğuna takılmayacaktır.

Örnek: Çoklu catch Bloğu

public static void main(String[] args) {

  int[] array = new int[] {1, 2, 3, 4, 5};

  int a=0, b=0;

  try {

    System.out.println("Try Bloğu");

    System.out.println("array[6]="+array[6]);

    a = 20 / b;

  }

  catch(ArrayIndexOutOfBoundsException e){

    System.out.println(e.toString());

  }

  catch(ArithmeticException ex) {

    System.out.println(ex.toString());

  }

}

Program dallanma yaptığı için  sıfıra bölme hatası yakalanmayacaktır.

Örnek: Tek catch Bloğu ile çoklu hata kontrolü

public static void main(String[] args) {

  int[] array = new int[] {1, 2, 3, 4, 5};

  int a=0, b=0;

  try {

    System.out.println("Try Bloğu");

    System.out.println("array[6]="+array[6]);

    a = 20 / b;

  }

  catch(ArrayIndexOutOfBoundsException | ArithmeticException e){

    System.out.println(e.toString());

  }

}

———————————————–

Try Bloğu

java.lang.ArrayIndexOutOfBoundsException: 6

İç içe Yuvalanmış try İfadeleri

  • Java da bir try bloğunun içerisine yeni bir try-catch bloğu oluşturulabilir.
  • Biz bu yapılara iç-içe try-catch blokları diyoruz.
  • Derleyici hata meydana geldiği zaman otomatik olarak en içteki try bloğundan itibaren çalışmaya başlar ve işlenen tüm try blokları içerisinde yakalan tüm hataları işler.
  • Gerekmedikçe kullanmayınız.

Örnek

public class NestedTryCatch {

  public static void main(String[] args) {

    int[] dizi= {1,2};

    try {

      try {

        int a=1, b=0;

        b=a/(a-a);

      }

      catch(ArithmeticException e) {

        System.out.println(e.toString());

      }

      dizi[3]=9;

    }

    catch(ArrayIndexOutOfBoundsException e) {

      System.out.println(e.toString());

    }

  }

}

———————————————–

java.lang.ArithmeticException: / by zero

java.lang.ArrayIndexOutOfBoundsException: 3

finally Kullanımı

  • Finally kullanımında program içerisinde istisna ile karşılaşıldığında, programın normal akışı değişeceğinden dolayı programda sapmalar olabilir.
  • Örneğin dosya okuma-yazma işlemlerinde hata olsa da olmasa da dosyamızı program sonunda kapatmamız gerekir yada veritabanından veri çektikten sonra veritabanı bağlantısını sonlandırmanız gerekiyor olabilir.
  • Bu gibi durumlarda istisna işleyicisin dosyayı kapatan kodu atlamamasını isteye bilirsiniz.
  • finally sözcüğü bu tip işlemlerde kullanılmak için tasarlanmıştır.

Örnek

public static void main(String[] args) {

  File dosya=new File("C:\\workspace\\kitap.txt");

  File dosya2=new File("C:\\workspace\\kitapkopya.txt");

  char data[]=new char[(int) dosya.length()];

  try(FileWriter yaz=new FileWriter(dosya2)) {

    FileReader reader=new FileReader(dosya);

    reader.read(data);

    yaz.write(data);

  }

  catch (IOException e) {

      e.printStackTrace(); //Hata yığınını ekrana basar

  }

  finally {

    System.out.println("Dosya kapatıldı");

  }

}

throw Anahtar Kelimesi

  • Program geliştiricisi uygulamanın herhangi bir yerinde kendisi bir istisna üretebilir.
  • trow kelimesi ile fırlatılan bu istisna başka bir yerde kullanılabilir.
  • Yada bilinen bir istisnai durum için açıklama içeriği değiştirilebilir.
  • Bu durumu bir örnek ile açıklayalım.

Örnek

import java.util.Scanner;

public class SayiBol {

  public static int sayiBol(int bolunen, int bolen) {

    if (bolen==0)

      throw new ArithmeticException("Sayı sıfırdan farklı olmalı");

    else

      return bolunen /bolen;

  }


 
public static void main(String[] args) {

    Scanner s=new Scanner(System.in);

    try {

      System.out.println("Birinci sayı:");

      int a= s.nextInt();

      System.out.println("İkinci sayı:");

      int b= s.nextInt();

      System.out.println("Sonuc: "+sayiBol(a, b));

    }

    catch (Exception e) {

      System.out.println(e.toString());

    }

  }

}

throws Anahtar Kelimesi

  • Eğer bir metot işleyemediği yada işlemek istemediği bir istisnaya (exception) neden oluyorsa metot bu durumu throws anahtar kelimesi ile bildirebilir.
  • Bir metot tanımlamasında throws anahtar kelimesi kullanılıyorsa bu metodu çağıran kod parçacıkları içinde metottun oluşturacağı istisnayı yakalayabilecek bir try-catch bloğu kullanılmak zorundadır.

public int method(int index) throws Exception

  • Yukarıdaki ifade ile Bu metot içerisinde bir hata oluşursa hatayı bir üst metoda gönder ve bu metodu çağıran metot hata ile ilgilensin.
  • Burada hata tipini en sonda throws ile gönderiyoruz.

Örnek

public class throwsExp {

  private int[] dizi=new int[] {1, 2, 3, 4};

 

  public int method(int index) throws Exception{

    return dizi[index];

  }

  public static void main(String[] args) {

    throwsExp obj=new throwsExp();

    try {

       for (int i=0; i<=4; i++) {

          System.out.println(obj.method(i));

       }

    }

    catch(Exception e) {

      System.out.println(e.toString());

    }

  }

}

Java’da en çok karşılaşılan Hata Türleri

Hata Tipleri

Hatanın Anlamı

ArithmeticException

Aritmatiksel bir işlem sırasında oluşan hata. Sıfıra bölme gibi.

ArrayIndexOutOfBoundsException

Dizi indeks sınırlarının dışındadır.

ArrayStoreException

Dizi yapısına uymayan bir değer kaydedilmeye çalışıldığında

ClassCastException

Uygunsuz class atama işlemi

IllegalArgumentException

Uygun olmayan argüman kullanımı

NullPointerException

Herhangi bir nesne değişkenine ilk değer atamadan kullanımı

IllegalMonitorStateException

Uygun olmayan monitör işlemi

IllegalStateException

Sistemin uygun pozisyonda olmadığını belirtir

IOException

Genel giriş/çıkış hataları

NumberFormatException

Uygun olmayan sayı formatı hatası

SecurityException

Güvenlik hatası

StringIndexOutOfBounds

String yapısının sınırlarından çıkma hatası

NoSuchMethodException

Kıllanılan methodun bulunmama hatası


Paylaşım , Takip İçin
0 0 votes
Article Rating

Bir Cevap Yazın

0 Yorum
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
HAYALİNDEKİ YAZILIM
%d blogcu bunu beğendi: