The Izjema Ravnanje je eden najmočnejših mehanizmov za obravnavanje napak med izvajanjem, tako da se lahko ohrani normalen tok aplikacije. V Javi je izjema nenormalno stanje. Programski jezik Java določa različne izjeme. V tem razdelku bomo obravnavali eno od pomembnih izjem, ki je ArithmeticException v Javi.
Aritmetična izjema je vrsta nenavadnega izida ali nepreverjene napake kode, ki se vrže ali dvigne vsakič, ko se med časom izvajanja v kodi pojavi napačna matematična ali aritmetična operacija. Težava med izvajanjem, imenovana tudi izjema, se pojavi vedno, ko je imenovalec ulomka 0 in JVM ne more najti rezultata; zato se izvajanje programa prekine in sproži se izjema. Upoštevajte, da se program prekine na točki, kjer je bila sprožena izjema. Vendar pa se izvede prejšnja koda in prikaže se ustrezen rezultat.
Struktura aritmetične izjeme
Osnovni razred aritmetične izjeme je java.lang.ArithmeticException, ki je podrejeni razred java.lang.RuntimeException, ta pa je podrejeni razred java.lang.Exception.
Konstruktor aritmetičnih izjem
Kako pride do aritmetične izjeme?
V naslednjih dveh primerih lahko pride do aritmetične izjeme.
- Ko izvedemo deljenje, kjer je 0 uporabljena kot delitelj, tj. 0 pride kot imenovalec.
- Dolgo decimalno število, ki se ne konča z Big Decimal.
Deli z 0
Ime datoteke: 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); } }
Izhod:
Exception in thread 'main' java.lang.ArithmeticException: / by zero at ArithmeticException.divide(ArithmeticException.java:6) at ArithmeticException.main(ArithmeticException.java:16)
Nekončna velika decimalka
Ime datoteke: 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()); } }
Izhod:
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)
Pojasnilo: V zgornjem programu razred Big Decimal ne pozna natančnega izhoda, ki ga prikaže po deljenju. To je zato, ker je izhod decimalna ekspanzija brez zaključka. Eden od pristopov za rešitev je določitev meje. Na primer, v programu lahko izrecno povemo, da mora biti izpis omejen na 6 decimalnih mest. Upoštevajte naslednji program.
Ime datoteke: 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()); } }
Izhod:
0.647058
Obravnava aritmetične izjeme
Aritmetično izjemo lahko rešimo sami z uporabo bloka try-catch. Upoštevajte naslednje programe.
Ime datoteke: 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); } }
Izhod:
Should avoid dividing by 0 java.lang.ArithmeticException: / by zero
Za neprekinjeno decimalno razširitev je vse, kar moramo storiti, to, da črto, kjer poteka deljenje, zavijemo znotraj poskusnega bloka.
Ime datoteke: 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); } } }
Izhod:
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.