web-dev-qa-db-ja.com

Javaの範囲外のチェックアウト

配列の場所が範囲外かどうかを確認しようとしていますが、最も簡単な方法は何ですか?

int[] arr;
populate(arr);
if(arr[-1] == null)
//out of bounds!

このようなものは機能しますか?

私はこれがtrycatchまたはスキャナーでできると確信していますが、単純な小さなプログラムのために、別の方法がありますか?

14
dukevin

絶対にしないこれにはtry-catchを使用します。単に使用します:

_boolean inBounds = (index >= 0) && (index < array.length);
_

Try-catchを使用してアプローチを実装すると、 ArrayIndexOutOfBoundsException をキャッチする必要があります。これは、チェックされない例外です(つまり、 RuntimeException のサブクラス)。そのような例外は決して(または、少なくともveryめったに)キャッチされて対処されるべきではありません。代わりに、それらはそもそも防止されるべきです。

言い換えると、未チェックの例外は、プログラムが回復は期待されないの例外です。さて、これには例外があるかもしれません(しゃれはありません)。たとえば、Integer.parseInt()を呼び出して潜在的なNumberFormatException(未チェック)をキャッチすることで、文字列が整数としてたとえられるかどうかをチェックするのが一般的な方法になりました。これは問題ありませんが、そのようなことを行う前に常によく考えてください。

34
arshajii

いいえ、例外が発生します。

代わりに、する

if (x < 0 || x >= arr.length) {
    //x is out of bounds!
}
3
Paul Draper

インデックスが手動で範囲内にあるかどうかを確認することをお勧めします。

if(index >=0 && index < array.length){
   // in range
}  

チェックされていない例外、つまりtry-catchブロックを必要としない例外はキャッチされません。 ArrayIndexOutOfBoundsExceptionはそれらの1つです。

チェックされていない例外はすべてRuntimeExceptionクラスに由来します。
このクラスからIndexOutOfBoundsExceptionが生成されます
これは、StringIndexOutOfBoundsおよびArrayIndexOutOfBoundsにさらに特化されています

RuntimeExceptionは、Java仮想マシンの通常の操作中にスローできる例外のスーパークラスです。

RuntimeExceptionとそのサブクラスは未チェックの例外です。メソッドまたはコンストラクターの実行によってスローされ、メソッドまたはコンストラクターの境界外に伝播できる場合、チェックされていない例外をメソッドまたはコンストラクターのthrows節で宣言する必要はありません。

2
Little Child