logo

Арифметичний виняток у Java

The Виняток Обробка є одним із найпотужніших механізмів обробки помилок виконання, щоб можна було підтримувати нормальний потік програми. У Java винятком є ​​ненормальний стан. Мова програмування Java визначає різні винятки. У цьому розділі ми обговоримо одне з відомих винятків ArithmeticException на Java.

Арифметичний виняток — це тип незвичайного результату або неперевіреної помилки коду, яка викидається або виникає щоразу, коли під час виконання в коді з’являється неправильна математична чи арифметична операція. Проблема виконання, яка також називається винятком, з’являється щоразу, коли знаменник дробу дорівнює 0, і JVM не може дізнатися результат; отже, виконання програми припиняється, і виникає виняток. Зауважте, що в точці, де була викликана виняткова ситуація, програма завершує роботу. Однак код, який був раніше, виконується, і відображається відповідний результат.

Структура арифметичних винятків

Базовим класом арифметичних винятків є java.lang.ArithmeticException, який є дочірнім класом java.lang.RuntimeException, який, у свою чергу, є дочірнім класом java.lang.Exception.

Конструктор арифметичних винятків

    ArithmeticException():Він використовується для визначення арифметичного винятку з переданими нульовими параметрами.ArithmeticException(String s):Він використовується для визначення арифметичного винятку з одним переданим параметром.

Як виникає арифметичний виняток?

Нижче наведено дві ситуації, коли може виникнути арифметичний виняток.

  1. Коли ми виконуємо ділення, де 0 використовується як дільник, тобто 0 стає знаменником.
  2. Довге десяткове число, яке не завершується великим десятковим числом.

Розділити на 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 

Для некінцевого десяткового розкладання все, що нам потрібно зробити, це загорнути рядок, де відбувається ділення, у блок try.

Ім'я файлу: 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.