[C#] IndexOutOfRangeExceptionとArgumentOutOfRangeExceptionについて


はじめに

C#で開発を行っていると様々な例外エラーが発生します。

今回はその中でも「IndexOutOfRangeException」と「ArgumentOutOfRangeException」について詳しく記載します。

この2つは意味は一緒ですが、使い方によって発生させる方法が異なります。

 

IndexOutOfRangeException とは

IndexOutOfRangeExceptionは無効なインデックスを使用し、そのインデックスでコレクションアイテムにアクセスしようとしていることを意味します。

インデックスは、コレクションの下限よりも小さいか、含まれている要素の数以上の場合は無効となります

たとえば、下記のような配列があると想定します。

byte[] array = new byte[4];

この配列へのアクセスは「0〜3」の範囲となります。

この範囲外の値を指定した場合に、「IndexOutOfRangeException」が発生します。

配列の長さは基本的に「0」ベースとなります。

つまり最初の要素のインデックスは「0」であり、最後の要素のインデックスは「長さ-1」となります。

 

IndexOutOfRangeException発生例

では実際に例外エラーを発生させてみたいと思います。


try
{
    // 配列の長さは3-1
    string[] samplearr = new string[]{"s1", "s2", "s3"};

    Console.WriteLine(samplearr[3]);
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
}

上記を実行すると、下記の様なエラーが発生します。

Index was outside the bounds of the array.

これが、「IndexOutOfRangeException」となります。

 

 

ArgumentOutOfRangeException

IndexOutOfRangeExceptionと同様に範囲外の値を指定した場合に発生する例外となります。

List<T>の場合ですが、有効なインデックスの範囲-0(リストのインデックスは常に0で始まります)からlist.Count-この範囲外の要素にアクセスすると例外が発生します。

このList<T>は、配列がIndexOutOfRangeExceptionを使用するのと同じ場合にArgumentOutOfRangeExceptionをスローすることに注意してください。

配列とは異なり、List<T>は空から始まります。そのため、作成されたばかりのリストのアイテムにアクセスしようとすると、この例外が発生します。

たとえば、以下の様なリストが存在するとします。

var list = new List<int>();

list[0] = 42;

これは、からのデータに無理やり42という値を追加しようとすることでエラーが発生します。

詳しくは、ArgumentOutOfRangeException クラス を参照ください。

 

さいごに

ちょっと初心に戻って、よくスローされる例外について簡単にまとめました。

特にIndexOutOfRangeExceptionとArgumentOutOfRangeExceptionは混在するので、注意してください。