3

たぶん私はこれが原因で疲れているかもしれませんが、どうすればこれを達成できますか?

int x = Integer.MAX_VALUE+10;

// 多分

int x = Integer.MIN_VALUE-20;

xが「範囲内」にあるかどうかをifステートメントでキャッチしたいのですが、次のようになります。

if(x >= Intefer.MAX_VALUE || x <= Integer.MIN_VALUE){ //throw exception}

ただし、問題は、値がMAX_VALUE + 10のように上記のとおりである場合、値がMAX VALUEより高くもMIN_VALUEよりも低くならず、if条件が満たされないことです。

編集:私が何を意味したかを明確にするために:最大/最小値よりも大きい値を実際に保存したくありません。これを想像してみてください:

フィールドに10+10と入力すると、「OK、それは20です」と表示されます。次に、誰かが1000000 * 100000と入力すると、回答も返されますが、最大/最小値を超える値を入力する可能性があります。たとえば、10000000 * 1000000 * 1000000などの場合、プログラムはすべて「ホールドアップ、高すぎます。代わりに「0」を使用してください」のようになります。

4

4 に答える 4

7

これは2つの方法で解決できます。

最初の方法:

if(x + 10 <= x){ //Has wrapped arround so throw exception}

2番目の方法(より良い):

long x = Integer.MAX_VALUE+10L;
これで、条件が正しく機能するようになりました

if(x >= Integer.MAX_VALUE){ //throw exception}

于 2012-09-08T19:00:29.500 に答える
6

制限よりも大きいまたは小さい整数を表す必要がある場合は、変数longの代わりにを使用します。int一方、intより大きい値を含む変数について本当に心配している場合はInteger.MAX_VALUE、心配するのをやめてください。そのようなことは存在できません。値がに格納されるまでにint、オーバーフローまたはアンダーフローはすでに発生しています。

于 2012-09-08T18:54:29.997 に答える
2

以前に提供されたすべてのソリューションの問題は、計算を実行するために、より大きなサイズのプリミティブにアップキャストすることを推奨していることです(のlong代わりにを使用するなどint)。

このアプローチは少し手間がかかり、すでに最大のプリミティブを使用している場合は失敗します。代わりに、演算を実行する前に、加算や減算などの演算がオーバーフローするかどうかを確認できます。

これは、CERT Oracle Secure Coding Standard for Javaの関数です。この関数は、減算など、他の数学演算子と同等の関数も提供します。

static final int safeAdd(int left, int right) throws ArithmeticException {
  if (right > 0 ? left > Integer.MAX_VALUE - right
                : left < Integer.MIN_VALUE - right) {
    throw new ArithmeticException("Integer overflow");
  }
  return left + right;
}
于 2014-03-14T04:16:57.393 に答える
0

Integer.MAX_VALUEおよびは、で表すMIN_VALUEことができる最大/最小の値です。それがポイントです:あなたはより少ないまたはより大きな値を持つことはできません。intint

小さい値または大きい値を保持してテストする場合は、を使用する必要がありますlong

たとえばに追加しInteger.MAX_VALUEて結果を。に保持しようとするintと、変数はオーバーフローし、結果はとの間の値のままにMAX_VALUEなりMIN_VALUEます。

于 2012-09-08T18:54:40.523 に答える