ال استثناء تعد المعالجة إحدى أقوى الآليات للتعامل مع أخطاء وقت التشغيل بحيث يمكن الحفاظ على التدفق الطبيعي للتطبيق. في Java، الاستثناء هو حالة غير طبيعية. تحدد لغة برمجة Java استثناءات مختلفة. في هذا القسم، سنناقش أحد الاستثناءات البارزة استثناء حسابي في جافا.
الاستثناء الحسابي هو نوع من النتائج غير العادية أو الخطأ غير المحدد في التعليمات البرمجية، والذي يتم طرحه أو رفعه عند ظهور عملية حسابية أو حسابية خاطئة في التعليمات البرمجية أثناء وقت التشغيل. تظهر مشكلة وقت التشغيل، والتي تسمى أيضًا الاستثناء، عندما يكون مقام الكسر 0، ولا يتمكن JVM من اكتشاف النتيجة؛ ومن ثم يتم إنهاء تنفيذ البرنامج، ويظهر استثناء. لاحظ أنه عند النقطة التي تم فيها رفع الاستثناء، ينتهي البرنامج. ومع ذلك، يتم تنفيذ التعليمات البرمجية الأقدم من ذلك، ويتم عرض النتيجة المناسبة.
هيكل الاستثناء الحسابي
فئة الاستثناء الحسابي الأساسية هي java.lang.ArithmeticException، وهي الفئة الفرعية لـ java.lang.RuntimeException، والتي بدورها هي الفئة الفرعية لـ java.lang.Exception.
منشئ الاستثناء الحسابي
كيف يحدث الاستثناء الحسابي؟
فيما يلي حالتين حيث قد يحدث الاستثناء الحسابي.
- عندما نقوم بإجراء قسمة حيث يتم استخدام 0 كمقسوم، أي أن 0 يأتي كمقام.
- رقم عشري طويل لا ينتهي بالرقم العشري الكبير.
القسمة على 0
اسم الملف: 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); } }
انتاج:
Exception in thread 'main' java.lang.ArithmeticException: / by zero at ArithmeticException.divide(ArithmeticException.java:6) at ArithmeticException.main(ArithmeticException.java:16)
رقم عشري كبير غير منتهٍ
اسم الملف: 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()); } }
انتاج:
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)
توضيح: في البرنامج أعلاه، لا تعرف فئة Big Decimal الإخراج الدقيق الذي يأتي بعد القسمة ليتم عرضه. فذلك لأن الناتج هو التوسع العشري غير المنتهي. أحد الأساليب لحلها هو توفير الحد. على سبيل المثال، يمكننا أن نقول بوضوح في البرنامج أن الإخراج يجب أن يقتصر على 6 منازل عشرية. لاحظ البرنامج التالي
اسم الملف: 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()); } }
انتاج:
0.647058
التعامل مع الاستثناء الحسابي
يمكننا التعامل مع الاستثناء الحسابي بأنفسنا باستخدام كتلة محاولة الالتقاط. لاحظ البرامج التالية
اسم الملف: 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); } }
انتاج:
Should avoid dividing by 0 java.lang.ArithmeticException: / by zero
بالنسبة للتوسيع العشري غير المنتهي، كل ما يتعين علينا فعله هو تغليف الخط الذي يحدث فيه القسمة داخل كتلة المحاولة.
اسم الملف: 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); } } }
انتاج:
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.