The Výnimka Obsluha je jedným z najvýkonnejších mechanizmov na spracovanie chýb pri behu, aby bolo možné zachovať normálny tok aplikácie. V jazyku Java je výnimkou abnormálny stav. Programovací jazyk Java definuje rôzne výnimky. V tejto časti budeme diskutovať o jednej z významných výnimiek, ktorou je Aritmetická výnimka v Jave.
Aritmetická výnimka je typ neobvyklého výsledku alebo nekontrolovanej chyby kódu, ktorá sa vyvolá alebo vyvolá vždy, keď sa v kóde počas spustenia objaví nesprávna matematická alebo aritmetická operácia. Problém s runtime, nazývaný aj výnimka, sa objaví vždy, keď je menovateľ zlomku 0 a JVM nie je schopné zistiť výsledok; preto sa vykonávanie programu ukončí a vyvolá sa výnimka. Všimnite si, že v bode, kde bola vyvolaná výnimka, sa program ukončí. Kód sa však vykoná skôr a zobrazí sa príslušný výsledok.
Štruktúra aritmetických výnimiek
Základnou triedou aritmetických výnimiek je java.lang.ArithmeticException, čo je podradená trieda java.lang.RuntimeException, ktorá je zase podradenou triedou java.lang.Exception.
Konštruktor aritmetických výnimiek
Ako sa vyskytuje aritmetická výnimka?
Nasledujú dve situácie, v ktorých môže nastať aritmetická výnimka.
- Keď vykonávame delenie, kde sa 0 používa ako deliteľ, t. j. ako menovateľ je 0.
- Dlhé desatinné číslo, ktoré nie je zakončené veľkou desatinnou čiarkou.
Deliť 0
Názov súboru: 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); } }
Výkon:
Exception in thread 'main' java.lang.ArithmeticException: / by zero at ArithmeticException.divide(ArithmeticException.java:6) at ArithmeticException.main(ArithmeticException.java:16)
Veľké desatinné miesto bez konca
Názov súboru: Aritmetická výnimka1.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()); } }
Výkon:
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)
Vysvetlenie: Vo vyššie uvedenom programe trieda Big Decimal nepozná presný výstup, ktorý sa zobrazí po delení. Je to preto, že výstupom je neukončený desatinný rast. Jedným zo spôsobov, ako to vyriešiť, je poskytnúť limit. Napríklad v programe môžeme explicitne povedať, že výstup by mal byť obmedzený na 6 desatinných miest. Dodržujte nasledujúci program.
Názov súboru: 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()); } }
Výkon:
0.647058
Spracovanie aritmetickej výnimky
Aritmetickú výnimku môžeme zvládnuť sami pomocou bloku try-catch. Dodržujte nasledujúce programy.
Názov súboru: 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); } }
Výkon:
Should avoid dividing by 0 java.lang.ArithmeticException: / by zero
Pre nekoncový desiatkový rozvoj všetko, čo musíme urobiť, je zalomiť riadok, kde dochádza k deleniu, vnútri bloku try.
Názov súboru: 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); } } }
Výkon:
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.