The Виняток Обробка є одним із найпотужніших механізмів обробки помилок виконання, щоб можна було підтримувати нормальний потік програми. У Java винятком є ненормальний стан. Мова програмування Java визначає різні винятки. У цьому розділі ми обговоримо одне з відомих винятків ArithmeticException на 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
Обробка арифметичних винятків
Ми можемо впоратися з арифметичним винятком самостійно, використовуючи блок 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.