logo

Аритметично изключение в Java

The Изключение Обработката е един от най-мощните механизми за справяне с грешките по време на изпълнение, така че да може да се поддържа нормалният поток на приложението. В Java изключението е необичайно състояние. Програмният език Java дефинира различни изключения. В този раздел ще обсъдим едно от видните изключения, което е ArithmeticException в Java.

Аритметичното изключение е вид необичаен резултат или непроверена грешка на кода, която се хвърля или повдига, когато в кода се появи грешна математическа или аритметична операция по време на изпълнение. Проблем по време на изпълнение, наричан още изключение, се появява винаги, когато знаменателят на дроб е 0 и JVM не може да открие резултата; следователно изпълнението на програмата се прекратява и се предизвиква изключение. Обърнете внимание, че в точката, в която е било повдигнато изключението, програмата се прекратява. Въпреки това, кодът по-рано от това се изпълнява и се показва подходящият резултат.

Структура на аритметично изключение

Базовият клас на аритметично изключение е java.lang.ArithmeticException, който е дъщерен клас на java.lang.RuntimeException, който от своя страна е дъщерен клас на java.lang.Exception.

Конструктор на аритметични изключения

    ArithmeticException():Използва се за дефиниране на аритметично изключение с предадени нула параметри.ArithmeticException(String s):Използва се за дефиниране на аритметично изключение с един предаден параметър.

Как възниква аритметично изключение?

Следват две ситуации, при които може да възникне аритметично изключение.

  1. Когато извършваме деление, където 0 се използва като делител, т.е. 0 идва като знаменател.
  2. Дълго десетично число, което не завършва с Big Decimal.

Разделете на 0

Име на файл: 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); } } 

Изход:

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

Незавършващ голям десетичен знак

Име на файл: 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()); } } 

Изход:

 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) 

Обяснение: В горната програма класът Big Decimal не знае точния изход, който идва след разделянето, за показване. Това е така, защото изходът е непрекратяващо десетично разширение. Един подход за решаването му е да се предостави ограничението. Например, можем да кажем изрично в програмата, че изходът трябва да бъде ограничен до 6 знака след десетичната запетая. Спазвайте следната програма.

Име на файл: 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()); } } 

Изход:

 0.647058 

Обработка на аритметично изключение

Можем да се справим с аритметичното изключение сами, използвайки блока try-catch. Спазвайте следните програми.

Име на файл: 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); } } 

Изход:

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

За непрекратяващо десетично разширение, всичко, което трябва да направим, е да обвием реда, където се извършва разделянето, вътре в блока try.

Име на файл: 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); } } } 

Изход:

 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.