Javaにおける java.lang.ArithmeticException: / by zero の修正方法

beginner Java2026-07-22| Java Development Kit (JDK) / Java Runtime Environment (JRE) - 全バージョン

Error Message

java.lang.ArithmeticException: / by zero
#java#例外処理#算術演算#デバッグ#バックエンド

このエラーが発生する理由

Javaコードで整数をゼロで除算しようとすると、JVMは即座に実行を停止し、java.lang.ArithmeticException: / by zero をスローします。例えば、100個のリンゴを0人で分けようとする場面を想像してください。これは単に「何もない」という結果ではなく、整数の計算においては処理不可能な操作として扱われます。

このクラッシュは、主に intlongshortbyte などの整数型で発生します。興味深いことに、浮動小数点数(doublefloat)の挙動は異なります。これらは IEEE 754 標準に従っているため、例外をスローしてプログラムを終了させる代わりに、Infinity(無限大)や NaN(非数)を返します。

クラッシュを引き起こすコードの例:

int totalScore = 500;
int players = 0;
int average = totalScore / players; // ここで java.lang.ArithmeticException: / by zero が発生

同じルールが剰余演算子(%)にも適用されます。ゼロで割った余りを求めようとすると、プログラムは失敗します。

int remainder = 10 % 0; // これも java.lang.ArithmeticException をスローします

修正方法

1. 事前に除数をバリデーションする

最も信頼できる修正方法は、計算を行う前に数値を確認することです。Webフォームから入力された値やデータベースから取得した数値など、ユーザー入力を扱う場合には必須のチェックです。

public void calculateShare(int total, int people) {
    if (people != 0) {
        int share = total / people;
        System.out.println("一人当たりの配分: " + share);
    } else {
        System.err.println("計算をスキップしました: 0人で割ることはできません。");
    }
}

2. Try-Catch ブロックを使用する

データが常に正常であることを期待していても、ゼロが入り込むことが真の「例外」として発生する場合があります。このような場合は、ロジックを try-catch ブロックで囲み、アプリケーション全体をクラッシュさせることなく適切に処理します。

try {
    int result = 100 / divisor;
} catch (ArithmeticException e) {
    System.out.println("エラー: ゼロ除算が発生しました。デフォルト値の0を使用します。");
    int result = 0; 
}

3. 三項演算子でデフォルト値を設定する

コードを簡潔に保ちたい場合は、三項演算子を使用します。分母が不足している場合にデフォルト値(0や1など)を設定するのに最適です。

// players が 0 の場合は average を 0 に設定し、それ以外の場合は除算を実行
int average = (players == 0) ? 0 : (totalScore / players);

4. 浮動小数点演算に切り替える

ロジックに小数の精度が必要ですか?数値を double にキャストすれば、例外は発生しなくなります。クラッシュする代わりに Infinity が返されるため、科学計算や金融計算の一部では扱いやすくなる場合があります。

double result = (double) 10 / 0; 
System.out.println(result); // 「Infinity」と出力

修正のテスト

コードをデプロイする前に、以下の3つのシナリオを実行して安定性を確認してください。

  • 正常系シナリオ: 10 / 2 が正しく 5 を返しますか?
  • ゼロ除算シナリオ: 除数が 0 のとき、アプリは動作し続けていますか?カスタムエラーメッセージやデフォルト値が表示されるか確認してください。
  • 負の数シナリオ: 10 / -2 が正しく -5 を返しますか?

重要なポイント

  • 入力のサニタイズ: UIやAPIが常にゼロ以外の数値を送ってくると想定してはいけません。計算前に必ずバリデーションを行いましょう。
  • コンテキストを含めたロギング: この例外をキャッチした場合は、関連する特定の変数をログに記録してください。例えば userId: 402 がゼロ除算エラーの原因だと分かれば、デバッグが大幅にスピードアップします。
  • 適切な型の選択: Javaにおいて 1.0 / 0.0 は有効な数学的状態(Infinity)ですが、1 / 0 は致命的なエラーになることを忘れないでください。

Related Error Notes