Javaでアンダーフローが発生しているかを確認する方法
変数に、その変数が取り得る最小値より小さい値が代入されると、アンダーフロー(underflow)が発生します。Javaでは、アンダーフローが起きてもJVMは例外をスローしません。そのため、アンダーフローの状態を検出して適切に対処するのはプログラマーの責任となります。
アンダーフローの仕組み
例えば、int型の最小値は「-2147483648(Integer.MIN_VALUE)」です。この最小値の状態からさらに1を引くと、結果はint型の範囲に収まらず、最大値側へ折り返してしまいます。これがアンダーフローです。意図しない計算結果を防ぐためには、より大きなデータ型(longなど)で計算を行い、結果がint型の範囲内に収まっているかを事前にチェックする方法が有効です。
コード例
以下の例では、int型の最小値から-1を減算する処理をlong型にキャストして計算し、結果がInteger.MIN_VALUEより小さい場合にArithmeticExceptionをスローしています。
public class UnderflowTest {
public static void main(String[] args) {
int num1 = -2147483648;
int num2 = -1;
System.out.println("Number 1: " + num1);
System.out.println("Number 2: " + num2);
// long型にキャストして計算することで、
// アンダーフローを正しく検出できる
long sum = (long) num1 + (long) num2;
if (sum < Integer.MIN_VALUE) {
throw new ArithmeticException("Underflow occurred!");
}
System.out.println("The sum of two numbers : " + (int) sum);
}
}
実行結果
Number 1: -2147483648
Number 2: -1
Exception in thread "main" java.lang.ArithmeticException: Underflow occurred!
at UnderflowTest.main(UnderflowTest.java:12)
ポイントのまとめ
- JavaのJVMはアンダーフローを自動的に検出せず、例外もスローしない。
- 演算前にlong型などの大きいデータ型へキャストして計算すると、オーバーフロー・アンダフローを確実に検出できる。
- Integer.MIN_VALUEやInteger.MAX_VALUEと比較することで、安全に境界チェックが可能。
- Math.subtractExact()などのExact系メソッドを使えば、オーバーフロー・アンダーフロー時に自動的にArithmeticExceptionをスローさせることもできる。
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー
-
JavaでJTextFieldに入力できる文字数を制限する方法(PlainDocument活用)
JTextFieldは、Swingアプリケーションにおいてユーザーにテキストを1行形式で入力させるための、最も重要なコンポーネントの一つです。フォームや検索ボックスなど、さまざまな場面で利用されますが、場合によっては「入力できる文字数に上限を設けたい」という要件が発生します。このような文字数制限は、PlainDocumentクラスを継承したカスタムドキュメントを作成することで簡単に実現できます。ドキュメントはJTextFieldの内部でテキストデータを管理する役割を持つため、ここで挿入処理を制御すれば、上限を超える文字入力を防ぐことが可能です。実装のポイントPlainDocumentを継承した