logo

Excepție aritmetică în Java

The Excepție Manipularea este unul dintre cele mai puternice mecanisme pentru a gestiona erorile de rulare, astfel încât fluxul normal al aplicației să poată fi menținut. În Java, excepția este o condiție anormală. Limbajul de programare Java definește diverse excepții. În această secțiune, vom discuta despre una dintre excepțiile proeminente, adică ArithmeticException în Java.

Excepția aritmetică este un tip de rezultat neobișnuit sau eroare neverificată a codului, care este aruncată sau ridicată ori de câte ori apare o operație matematică sau aritmetică greșită în cod în timpul rulării. O problemă de rulare, numită și excepție, apare ori de câte ori numitorul unei fracții este 0, iar JVM-ul nu este capabil să afle rezultatul; prin urmare, execuția programului este încheiată și se ridică o excepție. Rețineți că în punctul în care a fost ridicată excepția, programul se termină. Cu toate acestea, codul este executat mai devreme și este afișat rezultatul corespunzător.

Structura de excepție aritmetică

Clasa de bază a excepției aritmetice este java.lang.ArithmeticException, care este clasa copil a java.lang.RuntimeException, care, la rândul său, este clasa copil a java.lang.Exception.

Constructor de excepții aritmetice

    ArithmeticException():Este folosit pentru a defini o excepție aritmetică cu zero parametri trecuți.ArithmeticException (șir de caractere):Este folosit pentru a defini o excepție aritmetică cu un parametru trecut.

Cum apariția excepției aritmetice?

Următoarele sunt două situații în care poate apărea excepția aritmetică.

  1. Când efectuăm o împărțire în care 0 este folosit ca divizor, adică 0 vine ca numitor.
  2. Un număr zecimal lung care nu se încheie cu Big Decimal.

Împărțiți la 0

Nume de fișier: 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); } } 

Ieșire:

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

Decimală mare neterminabilă

Nume de fișier: 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()); } } 

Ieșire:

 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) 

Explicaţie: În programul de mai sus, clasa Big Decimal nu cunoaște rezultatul exact, care vine după divizare, de afișat. Acest lucru se datorează faptului că rezultatul este o expansiune zecimală fără sfârșit. O abordare pentru a o rezolva este de a oferi limita. De exemplu, putem spune în mod explicit în program că rezultatul ar trebui să fie limitat la 6 zecimale. Respectați următorul program.

Nume de fișier: 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()); } } 

Ieșire:

 0.647058 

Gestionarea excepției aritmetice

Putem gestiona singuri excepția aritmetică folosind blocul try-catch. Respectați următoarele programe.

Nume de fișier: 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); } } 

Ieșire:

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

Pentru extinderea zecimală fără sfârșit, tot ce trebuie să facem este să înfășurăm linia în care are loc diviziunea în blocul try.

Nume de fișier: 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); } } } 

Ieșire:

 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.