Bu eğitimde, örnekler yardımıyla Java'da birden çok istisnayı ele almayı öğreneceğiz.
Java 7'den önce, kod fazlalığı olsa bile farklı istisna türleri için birden fazla istisna işleme kodu yazmamız gerekiyordu.
Bir örnek alalım.
Örnek 1: Birden çok yakalama bloğu
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()); ) ) )
Çıktı
/ sıfıra göre
Bu örnekte iki istisna ortaya çıkabilir:
ArithmeticException
çünkü bir sayıyı 0'a bölmeye çalışıyoruz.ArrayIndexOutOfBoundsException
çünkü 0 ile 9 arası dizi sınırlarına sahip yeni bir tamsayı dizisi tanımladık ve dizin 10'a bir değer atamaya çalışıyoruz.
Her iki catch
bloktaki istisna mesajını, yani yinelenen kodu yazdırıyoruz .
Atama operatörünün ilişkilendirilebilirliği =
sağdan sola doğrudur, bu nedenle ArithmeticException
ilk önce mesajla / sıfırla atılır.
Bir Yakalama Bloğunda Birden Fazla İstisnayı Yönetin
Java SE 7 ve sonrasında, artık tek bir catch
blokta birden fazla istisna türü yakalayabiliriz .
catch
Blok tarafından ele alınabilen her istisna türü, dikey bir çubuk veya boru kullanılarak ayrılır |
.
Sözdizimi şöyledir:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Örnek 2: Çoklu yakalama bloğu
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()); ) ) )
Çıktı
/ sıfıra göre
Tek bir catch
blokta birden çok istisnayı yakalamak, kod kopyalamasını azaltır ve verimliliği artırır.
Bu programı derlerken üretilen bayt catch
kodu, kod fazlalığı olmadığı için birden fazla bloğa sahip programdan daha küçük olacaktır .
Not: Bir catch
blok birden fazla istisnayı işliyorsa, catch parametresi örtük olarak yapılır final
. Bu, parametreleri yakalamak için herhangi bir değer atayamayacağımız anlamına gelir.
Temel İstisna Yakalama
Tek bir catch
blokta birden fazla istisna yakalanırken, kural özel olarak genelleştirilir.
Bu, catch
blokta bir istisnalar hiyerarşisi varsa, birden fazla özel istisnayı yakalamak yerine yalnızca temel istisnayı yakalayabileceğimiz anlamına gelir .
Bir örnek alalım.
Örnek 3: 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()); ) ) )
Çıktı
/ sıfıra göre
Tüm istisna sınıflarının sınıfın alt sınıfları olduğunu biliyoruz Exception
. Böylece, birden fazla özel istisnayı yakalamak yerine, Exception
sınıfı yakalayabiliriz .
Temel istisna sınıfı catch
blokta zaten belirtilmişse , aynı catch
blokta alt istisna sınıflarını kullanmayın . Aksi takdirde bir derleme hatası alacağız.
Bir örnek alalım.
Örnek 4: 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()); ) ) )
Çıktı
Main.java:6: hata: Çoklu yakalama ifadesindeki alternatifler alt sınıflandırma ile ilişkilendirilemez
Bu örnekte ArithmeticException
ve ArrayIndexOutOfBoundsException
her ikisi de sınıfın alt Exception
sınıflarıdır. Yani bir derleme hatası alıyoruz.