- Math.addExact()とは何か
- まずはオーバーフローを理解しよう
- なぜオーバーフローが危険なのか
- Math.addExact()の基本構文
- ステップバイステップで理解する
- 通常の加算との違い
- 最重要:オーバーフロー時の動作
- 通常加算との比較
- 例外処理と組み合わせる
- long型にも対応している
- 実務でよくある利用例① 売上集計
- 実務でよくある利用例② ポイント付与
- 実務でよくある利用例③ アクセス数集計
- 実務でよくある利用例④ 注文件数管理
- Math.incrementExact()との違い
- Math.subtractExact()との関係
- 内部ではどのような処理をしているのか
- 情報セキュリティの観点から見る重要性
- 実務で使えるテンプレート集
- 初心者が覚えておくべき重要ポイント
- まとめ
Math.addExact()とは何か
Javaで業務システムを開発していると、数値を加算する処理は毎日のように登場します。
例えば、
- 売上金額の集計
- ポイント加算
- 在庫数の更新
- アクセス数の集計
- 注文数の管理
- 会員数の集計
などです。
通常であれば、
value + amountJavaで十分に見えます。
しかしJavaには、
Math.addExact()Javaという安全な加算を行うためのメソッドが用意されています。
このメソッドの最大の特徴は、
「オーバーフローを検知できる」
ことです。
業務システムや長期間運用されるシステムでは非常に重要な機能です。
まずはオーバーフローを理解しよう
Math.addExact()を理解するためには、まずオーバーフローを理解する必要があります。
int型には最大値があります。
2147483647
これは、
Integer.MAX_VALUEJavaです。
もしこの値にさらに加算するとどうなるでしょうか。
// 最大値
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
);
JavaECサイトで利用できます。
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()と合わせて学ぶことで、安全な数値演算の知識がさらに深まるでしょう。
