Java'da Çoklu İstisnaları Yakalayın

Feb 17 2023
Java'da birden çok istisnayı işlemek için şunları yapabiliriz: Birden çok catch bloğu Java'da, tek bir try bloğu birden çok catch bloğuna sahip olabilir. Java'da neden birden çok catch bloğuna ihtiyacımız var? Java'daki çoklu yakalama blokları, farklı istisna türlerini işlemek için kullanılır.

Java'da birden çok istisnayı işlemek için şunları yapabiliriz:

  • Birden Çok Catch Bloğu Kullan: Burada, karşılık gelen bir try bloğu için birden çok catch bloğu altında birden çok istisnayı işleyebilirsiniz. Program akışı otomatik olarak tek tek catch bloğuna gelecek ve sonrasında istisnaya göre ilgili catch bloğu bulunup ona göre işlem yapılacak.
  • Bir Catch Bloğunun Bağımsız Değişkenlerinde Birden Çok Catch İfadesi Kullanın: Bu özellik Java 7'den geldi. Burada, karşılık gelen try bloğu için tek bir catch bloğu (boru işaretiyle ayrılmış) altında birden çok istisnayı işleyebilirsiniz. Program akışı otomatik olarak catch bloğuna gelecek ve try bloğu için catch bloğunun argümanları içindeki ilgili istisna bulunup ona göre işlem yapılacaktır.

Çoklu yakalama blokları

Java'da, tek bir try bloğu birden fazla catch bloğuna sahip olabilir.

Java'da neden birden çok catch bloğuna ihtiyacımız var?

Java'daki çoklu yakalama blokları, farklı istisna türlerini işlemek için kullanılır. Tek bir try bloğundaki ifadeler birden çok istisna oluşturduğunda, farklı istisna türlerini işlemek için birden çok catch bloğuna ihtiyaç duyarız. Java'da bu mekanizmaya multi-catch bloğu denir .

Bir try bloğunu bir veya daha fazla catch bloğu takip edebilir. Her catch bloğu farklı bir istisna işleyici içermelidir. Farklı bir istisna işleyici içeriyorsa, farklı yakalama bloklarında farklı istisnaları yakalayabilirsiniz . try bloğunda bir istisna oluştuğunda, bu özel istisnayı işleyen karşılık gelen catch bloğu yürütülür. Bu nedenle, farklı istisnalar oluştuğunda farklı görevler gerçekleştirmeniz gerekiyorsa, Java'da çoklu deneme yakalamayı kullanabilirsiniz.

Sözdizimi

Java'da birden fazla catch bloğu ile tek bir try kullanmanın sözdizimi aşağıdaki gibidir:

try 
{ 
  statements; 
} 
catch(ExceptionType1 e1) 
{ 
  statements; 
} 
catch(ExceptionType2 e2) 
{ 
  statements; 
}

Fırlatılan istisna nesnesi ilk catch bloğu ile eşleşmezse, ikinci catch bloğu kontrol eder ve bu böyle devam eder.

Bir seferde yalnızca bir istisna oluşur ve aynı anda yalnızca bir catch bloğu yürütülür. Tüm catch blokları, istisna ilk alt sınıftan ve ardından üst sınıftan gelecek şekilde düzenlenmelidir, yani ArithmeticException için catch, İstisna için catch'ten önce gelmelidir.

Çoklu Yakalama Bloğunun Akış Şeması

örnekler

örnek 1

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException e) {
      System.out.println(e.getMessage());
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    } 
  }
}

/ by zero

  • ArithmeticException çünkü bir sayıyı 0'a bölmeye çalışıyoruz.
  • ArrayIndexOutOfBoundException çünkü 0 ila 9 dizi sınırlarıyla yeni bir tamsayı dizisi bildirdik ve 10. dizine bir değer atamaya çalışıyoruz.

= atama operatörünün ilişkilendirilebilirliği sağdan sola doğrudur, bu nedenle önce / mesajıyla sıfır tarafından bir ArithmeticException atılır.

Örnek 2

class Example2{
   public static void main(String args[]){
     try{
         int a[]=new int[7];
         a[4]=30/0;
         System.out.println("First print statement in try block");
     }
     catch(ArithmeticException e){
        System.out.println("Warning: ArithmeticException");
     }
     catch(ArrayIndexOutOfBoundsException e){
        System.out.println("Warning: ArrayIndexOutOfBoundsException");
     }
     catch(Exception e){
        System.out.println("Warning: Some Other exception");
     }
   System.out.println("Out of try-catch block...");
  }
}

Warning: ArithmeticException
Out of try-catch block...

Bir İstisna İşleyici İle Birden Fazla İstisna Türünü Yakalamak

Java 7 ve sonrasında, tek bir catch bloğunda birden çok özel durumu işlemek için catch bloğu geliştirilmiştir . Birden fazla istisna yakalıyorsanız ve benzer kodlara sahiplerse.

Tek bir catch bloğu, her birini | ile ayırarak birden çok istisnayı işleme (yakalama) olasılığına sahiptir. (boru sembolü) catch bloğunda.

Bu özellik, kod tekrarını azaltabilir ve verimliliği artırabilir, ayrıca aşırı geniş bir istisna yakalama cazibesini azaltabilir. Bu program derlenirken oluşturulan bayt kodu , kod fazlalığı olmadığı için birden çok yakalama bloğuna sahip programdan daha küçük olacaktır.

Her bir catch bloğunda yinelenen kod içeren aşağıdaki örneği göz önünde bulundurun :

catch (IOException ex) {
     logger.log(ex);
     ex.printStackTrace();
catch (SQLException ex) {
     logger.log(ex);
     ex.printStackTrace();
}

Java SE 7 ve sonrasında, bu yaklaşımı kullanarak yinelenen kodu ortadan kaldırabiliriz.

Sözdizimi

Yan tümcede catch, bloğun işleyebileceği istisna türlerini belirtin ve her bir istisna türünü dikey bir çubukla ( |) ayırın:

try {
  // code
} catch (ExceptionType1 | Exceptiontype2 ex) { 
  // catch block
}

örnekler

örnek 1

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

/ by zero

Bu program derlenirken üretilen bayt kodu , kod fazlalığı olmadığı için birden çok catch bloğuna sahip programdan daha küçük olacaktır .

Not : Bir catch bloğu birden fazla istisna türünü işliyorsa, catch parametresi kesin olarak final olur . Bu örnekte, catch parametresi ex nihaidir ve bu nedenle ona catch bloğu içinde herhangi bir değer atayamazsınız .

Bu yaklaşım genellikle birden fazla istisna yakalıyorsanız ve benzer kodlara sahiplerse kullanılır. ama istediğimiz gibi de kullanabiliriz.

Örnek 2

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException|ArrayIndexOutOfBoundsException e) {
      if (e instanceof ArithmeticException)
          System.out.println("ArithmeticException");
      else
          System.out.println("ArrayIndexOutOfBoundsException");
    }
  }
}

Tek bir catch bloğunda birden fazla istisna yakalanırken , kural özele genelleştirilir.

Bu, catch bloğunda bir istisnalar hiyerarşisi varsa , birden çok özel istisnayı yakalamak yerine yalnızca temel istisnayı yakalayabileceğimiz anlamına gelir.

Bir örnek alalım.

Örnek 1: Yalnızca temel istisna sınıfını yakalama

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

/ by zero

Temel istisna sınıfı zaten catch bloğunda belirtilmişse , aynı catch bloğunda alt istisna sınıflarını kullanmayın . Aksi halde derleme hatası alırız.

Bir örnek alalım.

Örnek 2: Temel ve alt istisna sınıflarını yakalama

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing

programı

Bazı durumlarda, tek bir kod parçası birden fazla istisna oluşturabilir. Bu tür bir durumla başa çıkmak için, her biri farklı türde bir istisna yakalayan iki veya daha fazla catch yan tümcesi belirtebilirsiniz. Bir istisna atıldığında, her bir catch deyimi sırayla incelenir ve türü istisnanınkiyle eşleşen ilki yürütülür. Bir catch ifadesi yürütüldükten sonra diğerleri atlanır ve try/catch bloğundan sonra yürütme devam eder. Aşağıdaki örnek, iki farklı özel durum türünü yakalar:

// Demonstrate multiple catch statements.
class MultiCatch {
public static void main(String args[]) {
try {
    int a = args.length;
    System.out.println("a = " + a);
    int b = 42 / a;
    int c[] = { 1 };
    c[42] = 99;
} catch(ArithmeticException e) {
    System.out.println("Divide by 0: " + e);
} catch(ArrayIndexOutOfBoundsException e) {
    System.out.println("Array index oob: " + e);
}
System.out.println("After try/catch blocks.");
}
}

İşte her iki şekilde de çalıştırılarak oluşturulan çıktı:

C:\>java MultiCatch
a = 0
Divide by 0: java.lang.ArithmeticException: / by zero
After try/catch blocks.
C:\>java MultiCatch TestArg
a = 1
Array index oob: java.lang.ArrayIndexOutOfBoundsException:42
After try/catch blocks.

/* This program contains an error.
A subclass must come before its superclass in
a series of catch statements. If not,
unreachable code will be created and a
compile-time error will result.
*/
class SuperSubCatch {
public static void main(String args[]) {
    try {
        int a = 0;
        int b = 42 / a;
    } catch(Exception e) {
        System.out.println("Generic Exception catch.");
    }
    /* This catch is never reached because
    ArithmeticException is a subclass of Exception. */
    catch(ArithmeticException e) { // ERROR - unreachable
        System.out.println("This is never reached.");
    }
}
}

Mouad Oumous Java WhatsApp Grubuna Katılın

Mouad Oumous Telegram Kanalına Katılın

semafor | Java Eşzamanlı API Java Eşzamanlı API Paketleri — Bölüm 1 Java — 8 | BiFunction, BiConsumer ve BiPredicate Örnek Arayüzü