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ブロックで例外を握りつぶすだけではなく、変数の初期値や後続ロジックへの影響にも十分注意してください。
-
JavaでJFrameを画面の中央に表示する方法
JFrameはFrameクラスのサブクラスであり、フレームに追加されたコンポーネントは「コンテンツ」と呼ばれ、contentPaneによって管理されます。JFrameにコンポーネントを追加する場合は、フレーム本体に直接追加するのではなく、contentPane経由で追加するのが推奨されています。JFrameは境界線・タイトルバー・ボタンを持つWindowのようなウィンドウであり、Java Swingアプリケーションの大部分はこのJFrameをベースに実装されています。 デフォルトの状態では、JFrameは画面の左上に表示されます。これを画面中央に表示したい場合は、Windowクラスが提供するs
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。