logo

Exceção aritmética em Java

O Exceção O tratamento é um dos mecanismos mais poderosos para lidar com erros de tempo de execução, para que o fluxo normal do aplicativo possa ser mantido. Em Java, exceção é uma condição anormal. A linguagem de programação Java define várias exceções. Nesta seção, discutiremos uma das exceções proeminentes que é Exceção Aritmética em Java.

A exceção aritmética é um tipo de resultado incomum ou erro não verificado do código, que é lançado ou gerado sempre que uma operação matemática ou aritmética errada aparece no código durante o tempo de execução. Um problema de tempo de execução, também chamado de exceção, aparece sempre que o denominador de uma fração é 0 e a JVM não consegue descobrir o resultado; portanto, a execução do programa é encerrada e uma exceção é gerada. Observe que no ponto em que a exceção foi levantada, o programa termina. No entanto, o código anterior é executado e o resultado apropriado é exibido.

Estrutura de exceção aritmética

A classe base da exceção aritmética é java.lang.ArithmeticException, que é a classe filha de java.lang.RuntimeException, que por sua vez é a classe filha de java.lang.Exception.

Construtor de exceção aritmética

    Exceção Aritmética():É usado para definir uma exceção aritmética com zero parâmetros passados.ArithmeticException(Strings):É usado para definir uma exceção aritmética com um parâmetro passado.

Como ocorre a exceção aritmética?

A seguir estão duas situações em que a exceção aritmética pode ocorrer.

  1. Quando realizamos uma divisão onde 0 é usado como divisor, ou seja, 0 vem como denominador.
  2. Um número decimal longo que não termina em Big Decimal.

Dividir por 0

Nome do arquivo: 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); } } 

Saída:

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

Grande decimal sem terminação

Nome do arquivo: 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()); } } 

Saída:

 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ção: No programa acima, a classe Big Decimal não conhece a saída exata, que vem após a divisão, a ser exibida. É porque a saída é uma expansão decimal sem terminação. Uma abordagem para resolvê-lo é fornecer o limite. Por exemplo, podemos dizer explicitamente no programa que a saída deve ser limitada a 6 casas decimais. Observe o seguinte programa.

Nome do arquivo: 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()); } } 

Saída:

 0.647058 

Tratamento de exceção aritmética

Podemos lidar com a exceção aritmética sozinhos usando o bloco try-catch. Observe os seguintes programas.

Nome do arquivo: 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); } } 

Saída:

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

Para expansão decimal sem terminação, tudo o que precisamos fazer é quebrar a linha onde a divisão está ocorrendo dentro do bloco try.

Nome do arquivo: 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); } } } 

Saída:

 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.