Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでArithmeticException(非検査例外)を処理する方法を徹底解説

java.lang.ArithmeticExceptionは、Javaにおける非検査例外(unchecked exception)の一つです。実際の開発で最もよく目にするのは「java.lang.ArithmeticException: / by zero」というエラーで、これは2つの数値の除算を行った際に分母がゼロになると発生します。なお、ArithmeticExceptionのオブジェクトはJVMによって自動的に生成されることがあります。

例1:ArithmeticExceptionが発生するコード

public class ArithmeticExceptionTest {
    public static void main(String[] args) {
        int a = 0, b = 10;
        int c = b/a;
        System.out.println("Value of c is : "+ c);
    }
}

上記の例では、変数a(分母)の値がゼロであるため、除算の実行時にArithmeticExceptionがスローされます。

  • java.lang.ArithmeticException:除算処理中にJavaがスローした例外の種類を示しています。
  • / by zero:ArithmeticExceptionオブジェクトの生成時に渡された詳細メッセージで、「ゼロによる除算」が原因であることを意味します。

実行結果

Exception in thread "main" java.lang.ArithmeticException: / by zero
        at ArithmeticExceptionTest.main(ArithmeticExceptionTest.java:5)

ArithmeticExceptionへの対処方法

次に、try文とcatch文を使用して、ArithmeticExceptionを適切に処理する方法を見ていきましょう。

  • ArithmeticExceptionがスローされる可能性のある処理を、tryブロックとcatchブロックで囲みます。
  • 発生したArithmeticExceptionをcatchブロックで捕捉(キャッチ)します。
  • プログラムの実行が異常終了しないため、その後に必要な処理を継続して行うことができます。

例2:try-catchで例外を処理するコード

public class ArithmeticExceptionTest {
    public static void main(String[] args) {
        int a = 0, b = 10 ;
        int c = 0;
        try {
            c = b/a;
        } catch (ArithmeticException e) {
            e.printStackTrace();
            System.out.println("We are just printing the stack trace.\n"+ "ArithmeticException is handled. But take care of the variable \"c\"");
        }
        System.out.println("Value of c :"+ c);
    }
}

例外が発生すると、プログラムの実行フローは例外の発生箇所から直ちにcatchブロックへ移行します。catchブロック内のステートメントが実行された後、try-catchブロックの後続の処理から通常どおり実行が再開されます。この仕組みにより、たとえ例外が発生してもプログラム全体を停止させることなく、安全に処理を続けられるのです。

実行結果

We are just printing the stack trace.
ArithmeticException is handled. But take care of the variable "c"
Value of c :0
java.lang.ArithmeticException: / by zero
        at ArithmeticExceptionTest.main(ArithmeticExceptionTest.java:6)

このように、try-catch構文を活用することで、ゼロ除算などの実行時エラーが発生してもアプリケーションをクラッシュさせずに制御できます。ただし、catchブロックで例外を握りつぶすだけではなく、変数の初期値や後続ロジックへの影響にも十分注意してください。

  1. JavaでJFrameを画面の中央に表示する方法

    JFrameはFrameクラスのサブクラスであり、フレームに追加されたコンポーネントは「コンテンツ」と呼ばれ、contentPaneによって管理されます。JFrameにコンポーネントを追加する場合は、フレーム本体に直接追加するのではなく、contentPane経由で追加するのが推奨されています。JFrameは境界線・タイトルバー・ボタンを持つWindowのようなウィンドウであり、Java Swingアプリケーションの大部分はこのJFrameをベースに実装されています。 デフォルトの状態では、JFrameは画面の左上に表示されます。これを画面中央に表示したい場合は、Windowクラスが提供するs

  2. JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説

    invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。