İstisna İşleme, uygulamanın normal akışının sürdürülebilmesi için çalışma zamanı hatalarını ele alan en güçlü mekanizmalardan biridir. Java'da istisna anormal bir durumdur. Java programlama dili çeşitli istisnaları tanımlar. Bu bölümde öne çıkan istisnalardan biri olan Aritmetikİstisna Java'da.
Aritmetik istisna, çalışma süresi boyunca kodda yanlış bir matematiksel veya aritmetik işlem göründüğünde ortaya çıkan, olağandışı bir sonuç veya kodun kontrol edilmeyen hatasıdır. İstisna olarak da adlandırılan bir çalışma zamanı sorunu, bir kesrin paydası 0 olduğunda ve JVM sonucu bulamadığında ortaya çıkar; dolayısıyla programın yürütülmesi sonlandırılır ve bir istisna ortaya çıkar. İstisnanın ortaya çıktığı noktada programın sonlandırıldığını unutmayın. Ancak bundan önceki kod yürütülür ve uygun sonuç görüntülenir.
Aritmetik İstisna Yapısı
Aritmetik istisna temel sınıfı, Java.lang.RuntimeException'ın alt sınıfı olan Java.lang.ArithmeticException'dır ve bu da Java.lang.Exception'ın alt sınıfıdır.
Aritmetik İstisna Oluşturucu
Aritmetik İstisna Nasıl Oluşur?
Aşağıda aritmetik istisnanın meydana gelebileceği iki durum verilmiştir.
- 0'ın bölen olarak kullanıldığı bir bölme işlemi yaptığımızda, yani payda olarak 0 gelir.
- Büyük Ondalık ile bitmeyen uzun bir ondalık sayı.
0'a Böl
Dosya adı: ArithmeticException.java
public class ArithmeticException { void divide(int a, int b) { // performing divison and storing th result int res = a / b; System.out.println('Division process has been done successfully.'); System.out.println('Result came after division is: ' + res); } // main method public static void main(String argvs[]) { // creating an object of the class ArithmeticException ArithmeticException obj = new ArithmeticException(); obj.divide(1, 0); } }
Çıktı:
Exception in thread 'main' java.lang.ArithmeticException: / by zero at ArithmeticException.divide(ArithmeticException.java:6) at ArithmeticException.main(ArithmeticException.java:16)
Sonlanmayan Büyük Ondalık Sayı
Dosya adı: ArithmeticException1.java
// import statement import java.math.BigDecimal; public class ArithmeticException1 { // main method public static void main(String[] argvs) { // creating two objects of BigDecimal BigDecimal a1 = new BigDecimal(11); BigDecimal a2 = new BigDecimal(17); // 11 / 17 = 0.6470588235294118... a1 = a1.divide(a2); System.out.println(a1.toString()); } }
Çıktı:
Exception in thread 'main' java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.base/java.math.BigDecimal.divide(BigDecimal.java:1766) at ArithmeticException1.main(ArithmeticException1.java:9)
Açıklama: Yukarıdaki programda Big Decimal sınıfı, bölme işleminden sonra görüntülenecek çıktıyı tam olarak bilmemektedir. Bunun nedeni, çıktının sonlanmayan ondalık genişleme olmasıdır. Bunu çözmek için bir yaklaşım limiti sağlamaktır. Örneğin çıktının 6 ondalık basamakla sınırlı olması gerektiğini programda açıkça söyleyebiliriz. Aşağıdaki programı izleyin.
Dosya adı: ArithmeticException2.java
// import statement import java.math.BigDecimal; public class ArithmeticException2 { // main method public static void main(String[] argvs) { // creating two objects of BigDecimal BigDecimal a1 = new BigDecimal(11); BigDecimal a2 = new BigDecimal(17); // 11 / 17 = 0.6470588235294118... // rounding up to decimal places a1 = a1.divide(a2, 6, BigDecimal.ROUND_DOWN); System.out.println(a1.toString()); } }
Çıktı:
0.647058
Aritmetik İstisnaları İşleme
Aritmetik istisnayı try-catch bloğunu kullanarak kendi başımıza halledebiliriz. Aşağıdaki programlara dikkat edin.
Dosya adı: HandleArithmeticException.java
public class HandleArithmeticException { void divide(int a, int b) { int res; try { // performing divison and storing th result res = a / b; System.out.println('Division process has been done successfully.'); System.out.println('Result came after division is: ' + res); } // handling the exception in the catch block catch(java.lang.ArithmeticException ex) { System.out.println('Should avoid dividing by 0 ' + ex); } } // main method public static void main(String argvs[]) { // creating an object of the class ArithmeticException ArithmeticException obj = new ArithmeticException(); obj.divide(1, 0); } }
Çıktı:
Should avoid dividing by 0 java.lang.ArithmeticException: / by zero
Sonlanmayan ondalık sayı açılımı için tek yapmamız gereken, bölmenin gerçekleştiği satırı try bloğunun içine sarmaktır.
Dosya adı: HandleArithmeticException1.java
// import statement import java.math.BigDecimal; public class HandleArithmeticException1 { // main method public static void main(String[] argvs) { // creating two objects of BigDecimal BigDecimal a1 = new BigDecimal(11); BigDecimal a2 = new BigDecimal(17); try { // 11 / 17 = 0.6470588235294118... a1 = a1.divide(a2); System.out.println(a1.toString()); } // handling the exception in the catch block catch(ArithmeticException ex) { System.out.println('Should avoid dividing by an integer that leads to non-terminating decimal expansion. ' + ex); } } }
Çıktı:
Should avoid dividing by an integer that leads to non-terminating decimal expansion. java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.