logo

Java の算術例外

例外 処理は、アプリケーションの通常のフローを維持できるようにランタイム エラーを処理するための最も強力なメカニズムの 1 つです。 Java では、例外は異常な状態です。 Java プログラミング言語では、さまざまな例外が定義されています。このセクションでは、顕著な例外の 1 つについて説明します。 算術例外 ジャワでは。

算術例外は、コードの異常な結果または未チェック エラーの一種であり、実行時に間違った数学演算または算術演算がコード内に出現するたびにスローまたは発生します。例外とも呼ばれる実行時の問題は、分数の分母が 0 で、JVM が結果を見つけられない場合に発生します。したがって、プログラムの実行は終了し、例外が発生します。例外が発生した時点でプログラムが終了することに注意してください。ただし、それより前のコードが実行され、適切な結果が表示されます。

算術例外構造

算術例外基本クラスは java.lang.ArithmeticException で、これは java.lang.RuntimeException の子クラスであり、さらに java.lang.RuntimeException の子クラスです。

算術例外コンストラクター

    ArithmeticException():これは、パラメータが渡されない算術例外を定義するために使用されます。ArithmeticException(文字列):これは、1 つのパラメーターが渡される算術例外を定義するために使用されます。

算術例外はどのように発生するのか?

算術例外が発生する可能性のある 2 つの状況を次に示します。

  1. 0 を除数として使用する除算を実行すると、0 が分母になります。
  2. Big Decimal で終了しない長い 10 進数。

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) 

終端のないビッグ 10 進数

ファイル名: 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 クラスは、除算後に表示される正確な出力を知りません。これは、出力が非終端 10 進展開であるためです。これを解決する 1 つのアプローチは、制限を設けることです。たとえば、出力を小数点以下 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 

終端のない 10 進数展開の場合、必要なのは、除算が行われている行を 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.