18

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

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

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

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

4

3 に答える 3

43

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

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

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

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

于 2013-10-30T01:37:19.937 に答える
3

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

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

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

すべての未チェックの例外はRuntimeExceptionクラスから発生します。
このクラスから、IndexOutOfBoundsException
This isさらにspecialized to StringIndexOutOfBoundsandArrayIndexOutOfBounds

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

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

于 2013-10-30T01:41:57.803 に答える
3

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

代わりに、

if (x < 0 || x >= arr.length) {
    //x is out of bounds!
}
于 2013-10-30T01:37:40.040 に答える