logo

Aritmetiskt undantag i Java

De Undantag Hantering är en av de mest kraftfulla mekanismerna för att hantera runtime-felen så att programmets normala flöde kan bibehållas. I Java är undantag ett onormalt tillstånd. Java programmeringsspråk definierar olika undantag. I det här avsnittet kommer vi att diskutera ett av de framträdande undantagen som är ArithmeticException i Java.

Det aritmetiska undantaget är en typ av ovanligt utfall eller okontrollerat fel i koden, som kastas eller höjs när en felaktig matematisk eller aritmetisk operation visas i koden under körning. Ett körtidsproblem, även kallat undantag, dyker upp när nämnaren för ett bråk är 0 och JVM inte kan ta reda på resultatet; därför avslutas programexekveringen och ett undantag tas upp. Observera att vid den punkt där undantaget har tagits upp avslutas programmet. Koden exekveras dock tidigare och lämpligt resultat visas.

Aritmetisk undantagsstruktur

Den aritmetiska undantagsbasklassen är java.lang.ArithmeticException, som är den underordnade klassen för java.lang.RuntimeException, som i sin tur är den underordnade klassen för java.lang.Exception.

Aritmetisk undantagskonstruktör

    ArithmeticException():Den används för att definiera ett aritmetiskt undantag med noll parametrar.ArithmeticException(String s):Den används för att definiera ett aritmetiskt undantag med en parameter passerad.

Hur inträffar aritmetiska undantag?

Följande är två situationer där det aritmetiska undantaget kan förekomma.

  1. När vi utför en division där 0 används som divisor, dvs 0 kommer som nämnare.
  2. Ett långt decimaltal som inte avslutas med stor decimal.

Dividera med 0

Filnamn: 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); } } 

Produktion:

 Exception in thread 'main' java.lang.ArithmeticException: / by zero at ArithmeticException.divide(ArithmeticException.java:6) at ArithmeticException.main(ArithmeticException.java:16) 

Icke-avslutande stor decimal

Filnamn: 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()); } } 

Produktion:

 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) 

Förklaring: I programmet ovan vet inte klassen Big Decimal den exakta utdata, som kommer efter division, att visa. Det beror på att utgången är icke-avslutande decimalexpansion. Ett sätt att lösa det är att ge gränsen. Till exempel kan vi säga uttryckligen i programmet att utdata ska begränsas till 6 decimaler. Observera följande program.

Filnamn: 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()); } } 

Produktion:

 0.647058 

Hantering av aritmetiskt undantag

Vi kan hantera det aritmetiska undantaget på egen hand med hjälp av try-catch-blocket. Observera följande program.

Filnamn: 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); } } 

Produktion:

 Should avoid dividing by 0 java.lang.ArithmeticException: / by zero 

För icke-avslutande decimalexpansion, allt vi behöver göra är att linda linjen där division sker inuti försöksblocket.

Filnamn: 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); } } } 

Produktion:

 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.