logo

חריג אריתמטי בג'אווה

ה יוצא מן הכלל טיפול הוא אחד המנגנונים החזקים ביותר לטיפול בשגיאות זמן הריצה כך שניתן יהיה לשמור על הזרימה הרגילה של האפליקציה. ב-Java, חריג הוא מצב חריג. שפת התכנות Java מגדירה חריגים שונים. בחלק זה, נדון באחד החריגים הבולטים כלומר ArithmeticException ב-Java.

החריג האריתמטי הוא סוג של תוצאה חריגה או שגיאה לא מסומנת של הקוד, הנזרקת או מועלית בכל פעם שמופיעה פעולה מתמטית או אריתמטית שגויה בקוד במהלך זמן הריצה. בעיה בזמן ריצה, הנקראת גם חריגה, מופיעה בכל פעם שהמכנה של שבר הוא 0, וה-JVM אינו מסוגל לגלות את התוצאה; לפיכך הפעלת התוכנית מופסקת, ומועלה חריג. שימו לב שבנקודה שבה הועלתה החריגה, התוכנית מסתיימת. עם זאת, הקוד מוקדם מזה מבוצע, והתוצאה המתאימה מוצגת.

מבנה חריג אריתמטי

מחלקת הבסיס החריגה האריתמטית היא java.lang.ArithmeticException, שהיא מחלקת הילד של java.lang.RuntimeException, שבתורה היא מחלקת הילד של java.lang.Exception.

בונה חריגים אריתמטיים

    ArithmeticException():הוא משמש להגדרת חריג אריתמטי עם אפס פרמטרים שעברו.ArithmeticException(String s):הוא משמש להגדרת חריג אריתמטי עם פרמטר אחד שעבר.

איך התרחשות חריגה אריתמטית?

להלן שני מצבים שבהם החריג האריתמטי עשוי להתרחש.

  1. כאשר אנו מבצעים חלוקה שבה 0 משמש כמחלק, כלומר, 0 מגיע כמכנה.
  2. מספר עשרוני ארוך שאינו מסתיים ב-Big Decimal.

חלק ב-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 

טיפול בחריג אריתמטי

אנו יכולים להתמודד עם החריגה האריתמטית בעצמנו באמצעות בלוק ה-Try-catch. שימו לב לתוכניות הבאות.

שם קובץ: 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.