The Wyjątek Obsługa jest jednym z najpotężniejszych mechanizmów obsługi błędów środowiska wykonawczego, umożliwiającym utrzymanie normalnego przepływu aplikacji. W Javie wyjątek jest stanem nienormalnym. Język programowania Java definiuje różne wyjątki. W tej sekcji omówimy jeden z najważniejszych wyjątków, czyli Wyjątek arytmetyczny w Jawie.
Wyjątek arytmetyczny to rodzaj nietypowego wyniku lub niesprawdzonego błędu kodu, który jest zgłaszany lub zgłaszany za każdym razem, gdy w kodzie w czasie wykonywania pojawia się błędna operacja matematyczna lub arytmetyczna. Problem w czasie wykonywania, zwany także wyjątkiem, pojawia się, gdy mianownik ułamka wynosi 0, a maszyna JVM nie jest w stanie znaleźć wyniku; w związku z tym wykonywanie programu zostaje zakończone i zgłaszany jest wyjątek. Należy pamiętać, że w momencie zgłoszenia wyjątku program kończy działanie. Jednakże wykonywany jest kod wcześniejszy i wyświetlany jest odpowiedni wynik.
Struktura wyjątków arytmetycznych
Bazową klasą wyjątku arytmetycznego jest java.lang.ArithmeticException, która jest klasą podrzędną java.lang.RuntimeException, która z kolei jest klasą podrzędną java.lang.Exception.
Konstruktor wyjątków arytmetycznych
Jak wystąpić wyjątek arytmetyczny?
Poniżej przedstawiono dwie sytuacje, w których może wystąpić wyjątek arytmetyczny.
- Kiedy wykonujemy dzielenie, w którym 0 jest używane jako dzielnik, tj. 0 jest mianownikiem.
- Długa liczba dziesiętna, która nie kończy się znakiem Big Decimal.
Podziel przez 0
Nazwa pliku: 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); } }
Wyjście:
Exception in thread 'main' java.lang.ArithmeticException: / by zero at ArithmeticException.divide(ArithmeticException.java:6) at ArithmeticException.main(ArithmeticException.java:16)
Niekończący się duży dziesiętny
Nazwa pliku: 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()); } }
Wyjście:
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)
Wyjaśnienie: W powyższym programie klasa Big Decimal nie zna dokładnego wyniku wyświetlanego po dzieleniu. Dzieje się tak dlatego, że wyjściem jest niekończące się rozwinięcie dziesiętne. Jednym ze sposobów rozwiązania tego problemu jest zapewnienie limitu. Na przykład możemy wyraźnie powiedzieć w programie, że wynik powinien być ograniczony do 6 miejsc po przecinku. Przestrzegaj poniższego programu.
Nazwa pliku: 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()); } }
Wyjście:
0.647058
Obsługa wyjątków arytmetycznych
Wyjątek arytmetyczny możemy obsłużyć samodzielnie, korzystając z bloku try-catch. Przestrzegaj następujących programów.
Nazwa pliku: 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); } }
Wyjście:
Should avoid dividing by 0 java.lang.ArithmeticException: / by zero
W przypadku niekończącego się rozwinięcia dziesiętnego wystarczy zawinąć linię, w której następuje dzielenie, wewnątrz bloku try.
Nazwa pliku: UchwytArithmeticException1.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); } } }
Wyjście:
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.