Java Tips | 基本ユーティリティ:Math.subtractExact()

Web APP Java
スポンサーリンク
スポンサーリンク

Math.addExact()とは何か

Javaで業務システムを開発していると、数値を加算する処理は毎日のように登場します。

例えば、

  • 売上金額の集計
  • ポイント加算
  • 在庫数の更新
  • アクセス数の集計
  • 注文数の管理
  • 会員数の集計

などです。

通常であれば、

value + amount
Java

で十分に見えます。

しかしJavaには、

Math.addExact()
Java

という安全な加算を行うためのメソッドが用意されています。

このメソッドの最大の特徴は、

「オーバーフローを検知できる」

ことです。

業務システムや長期間運用されるシステムでは非常に重要な機能です。

まずはオーバーフローを理解しよう

Math.addExact()を理解するためには、まずオーバーフローを理解する必要があります。

int型には最大値があります。

2147483647

これは、

Integer.MAX_VALUE
Java

です。

もしこの値にさらに加算するとどうなるでしょうか。

// 最大値
int value =
        Integer.MAX_VALUE;

// 加算
int result =
        value + 1;

// 結果表示
System.out.println(result);
Java

実行結果

-2147483648

驚くかもしれませんが、マイナスになります。

これがオーバーフローです。

なぜオーバーフローが危険なのか

初心者のうちは問題になりにくいかもしれません。

しかし実務では、

  • 累計売上
  • アクセス数
  • ポイント残高
  • 注文件数
  • ログ件数

などの値が長年増え続けることがあります。

オーバーフローが発生すると、


100万件
↓
1000万件
↓
1億件
↓
突然マイナス値

という異常状態になることがあります。

しかも通常の加算ではエラーにならないため発見が遅れやすいのです。

Math.addExact()の基本構文

基本構文は非常にシンプルです。

Math.addExact(値1, 値2)
Java

実際に使ってみましょう。

// 売上
int sales = 100;

// 加算
int result =
        Math.addExact(
                sales,
                50
        );

// 結果表示
System.out.println(result);
Java

実行結果

150

通常の加算と同じ結果になります。

ステップバイステップで理解する

ステップ1:加算対象を用意する

// 現在ポイント
int point = 1000;
Java

ステップ2:加算値を用意する

// 追加ポイント
int bonusPoint = 500;
Java

ステップ3:Math.addExact()を実行する

// 加算
int totalPoint =
        Math.addExact(
                point,
                bonusPoint
        );
Java

ステップ4:結果を確認する

// 表示
System.out.println(totalPoint);
Java

実行結果

1500

安全に加算処理が行われました。

通常の加算との違い

通常の加算です。

// 通常加算
int result =
        a + b;
Java

こちらはオーバーフローしても気付きません。

一方、

// 安全加算
int result =
        Math.addExact(
                a,
                b
        );
Java

はオーバーフローを検知できます。

最重要:オーバーフロー時の動作

Math.addExact()最大の特徴です。

// 最大値
int value =
        Integer.MAX_VALUE;

// 加算
Math.addExact(
        value,
        1
);
Java

実行結果

ArithmeticException

例外が発生します。

つまり、

「異常な加算が発生した」

ことを即座に検知できます。

通常加算との比較

通常加算


// オーバーフロー
Integer.MAX_VALUE + 1
Java

結果

-2147483648

異常値になります。

Math.addExact()


// 安全加算
Math.addExact(
        Integer.MAX_VALUE,
        1
);
Java

結果

ArithmeticException

異常を検知できます。

例外処理と組み合わせる

実務では例外処理を併用します。

try {

    int result =
            Math.addExact(
                    currentValue,
                    addValue
            );

} catch (ArithmeticException e) {

    System.out.println(
            "オーバーフローが発生しました"
    );

}
Java

これが実務での基本パターンです。

long型にも対応している

Math.addExact()はlong型にも対応しています。

// long型
long totalSales = 1000000L;

// 加算
long result =
        Math.addExact(
                totalSales,
                500000L
        );

System.out.println(result);
Java

実行結果

1500000

大規模システムの集計処理でも利用できます。

実務でよくある利用例① 売上集計

// 現在売上
long totalSales = 1000000;

// 本日の売上
long todaySales = 50000;

// 加算
totalSales =
        Math.addExact(
                totalSales,
                todaySales
        );
Java

売上管理システムで頻出します。

実務でよくある利用例② ポイント付与

// 保有ポイント
int point = 1000;

// ボーナスポイント
point =
        Math.addExact(
                point,
                500
        );
Java

ポイント管理システムで利用できます。

実務でよくある利用例③ アクセス数集計

// アクセス数
long accessCount = 1000000;

// 追加カウント
accessCount =
        Math.addExact(
                accessCount,
                1
        );
Java

アクセス解析システムで活用できます。

実務でよくある利用例④ 注文件数管理

// 注文件数
long orderCount = 5000;

// 新規注文
orderCount =
        Math.addExact(
                orderCount,
                25
        );
Java

ECサイトで利用できます。

Math.incrementExact()との違い

非常によく関連付けて学習されるメソッドです。

Math.incrementExact()


// 1加算
Math.incrementExact(value);
Java

結果

value + 1

Math.addExact()


// 任意加算
Math.addExact(
        value,
        100
);
Java

結果

value + 100

どちらもオーバーフロー検知機能があります。

Math.subtractExact()との関係

セットで覚えると理解しやすいメソッドです。

メソッド役割
Math.addExact()安全な加算
Math.subtractExact()安全な減算
Math.incrementExact()安全な+1
Math.decrementExact()安全な-1

業務システムではこれらを組み合わせて利用します。

内部ではどのような処理をしているのか

イメージとしては次のような処理です。

// イメージコード
int result = a + b;

// オーバーフロー確認
if (オーバーフロー発生) {

    throw new ArithmeticException();

}

return result;
Java

実際の実装はより高速化されていますが、考え方はこのようなものです。

情報セキュリティの観点から見る重要性

Math.addExact()はセキュリティ機能そのものではありません。

しかしシステムの信頼性向上に大きく貢献します。

オーバーフローを見逃すと、

  • 売上集計異常
  • ポイント異常
  • アクセス集計異常
  • 監査データ破損
  • 統計情報破損

などの重大な障害が発生する可能性があります。

安全な数値演算は品質の高い業務システムを作るための重要な考え方です。

実務で使えるテンプレート集

基本テンプレート


// 安全加算
result =
        Math.addExact(
                value1,
                value2
        );
Java

売上集計テンプレート


// 売上加算
totalSales =
        Math.addExact(
                totalSales,
                sales
        );
Java

ポイント付与テンプレート


// ポイント加算
point =
        Math.addExact(
                point,
                bonusPoint
        );
Java

例外処理付きテンプレート

try {

    total =
            Math.addExact(
                    total,
                    value
            );

} catch (
        ArithmeticException e
) {

    // オーバーフロー対応

}
Java

初心者が覚えておくべき重要ポイント

  • オーバーフローを検知できる加算メソッドである
  • 通常の「+」演算子より安全である
  • 異常時はArithmeticExceptionが発生する
  • int型とlong型に対応している
  • 売上集計やポイント管理で便利である
  • 大規模システムほど価値が高い
  • incrementExact()との違いを理解する

まとめ

Math.addExact()は、安全に加算を行うためのJava標準メソッドです。

  • 通常の加算と同じ結果を返す
  • オーバーフローを検知できる
  • 異常時にはArithmeticExceptionを発生させる
  • int型・long型に対応している
  • 売上集計やアクセス集計で活躍する
  • システムの信頼性向上につながる
  • Java開発者が覚えておきたい安全な数値演算ユーティリティである

特に業務システムでは、「加算できること」よりも「異常な加算を検知できること」の方が重要になる場面があります。Math.addExact()を利用することで、静かに壊れるシステムではなく、異常を早期に発見できる堅牢なシステムを構築できるようになります。また、Math.subtractExact()、Math.incrementExact()、Math.decrementExact()と合わせて学ぶことで、安全な数値演算の知識がさらに深まるでしょう。

タイトルとURLをコピーしました