※ この記事にはアフィリエイトリンクが含まれます
C#で IndexOutOfRangeException に悩んでいませんか?
配列やインデックスを扱うときに突然例外が出て
原因がわからず詰まることはよくあります。
- 配列やリストのループ処理で突然エラーになる
for文の開始・終了条件でオフバイワンエラーが起きる- 文字列や多次元配列の添字を間違えている
結論から言うと、IndexOutOfRangeException は
「添字が配列や文字列の有効範囲外を指している」ことが原因です。
- アクセス前に長さ(Length / Count)を確認する
- ループ条件を
i < array.Lengthのように正しくする - Tryパターンや安全な取得メソッドを使う
この記事では、初心者向けに IndexOutOfRangeException の
原因と再現例、具体的な対処法をわかりやすく解説します。
この記事を読むと、エラーの原因を素早く突き止め
安全に配列やリストを扱えるようになります。
C# の IndexOutOfRangeException とは
IndexOutOfRangeException はランタイム例外の一つで
配列や文字列のインデックスが無効なときに発生します。
具体的には0以上、Length-1以下の範囲を超えた位置へ
アクセスしようとした場合に投げられます。
どんなときに起きるか(基本パターン)
代表的な発生パターンは次の通りです。
どれも初心者がよく陥りやすいミスです。
forループで条件をi <= array.Lengthとしてしまう- 配列の長さを越えるインデックスを直接指定する
- 多次元配列やジャグ配列のインデックスを混同する
発生例:簡単な再現コード
まずは最も単純な再現例を見てみましょう。
このコードは配列の最後の次を参照して例外になります。
int[] arr = new int[] { 1, 2, 3 };
// 誤り:arr.Length は 3。最大インデックスは 2
int value = arr[3]; // IndexOutOfRangeExceptionこの例では arr[3] が配列の範囲外なのでIndexOutOfRangeException が発生します。
for ループでよくあるミス
for ループで条件を <= にしてしまうのは 典型的なオフバイワン(1つずれ)エラーです。
for (int i = 0; i <= arr.Length; i++)
{
Console.WriteLine(arr[i]); // 最後のループで例外
}正しくは i < arr.Length とします。
この違いだけで例外が回避できます。
List と配列の違いに注意
配列(T[])と List<T> を混同すると戸惑います。List<T> は無効なインデックスで ArgumentOutOfRangeException を投げます。
つまり配列では IndexOutOfRangeException、List では ArgumentOutOfRangeException という点を覚えておきましょう。
原因の深掘り:どこをチェックすべきか
例外が出たらまずやるべきは「スタックトレースを読む」ことです。
どの行のどの配列アクセスで落ちたかが分かります。
次にその行の前後で配列やリストの Length/Count を確認します。
ループ変数や計算式の値もログやデバッガで見てください。
よくある原因一覧
- ループの終了条件の誤り(<= と < の違い)
- 負のインデックスを使っている(計算ミスでマイナスになる)
- 配列の長さを想定と違う値で使っている
- 多次元配列の次元を間違えている
対処法:基本のチェックと修正
まずはアクセス前に安全範囲かチェックする習慣を付けましょう。
簡単な条件分岐で多くのエラーは防げます。
if (index >= 0 && index < arr.Length)
{
var v = arr[index];
// 安全に処理
}
else
{
// ログ出力や代替処理
}ループでは次の書き方を徹底してください。i は 0 から始め、i < arr.Length を条件にします。
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}foreach の活用
可能なら foreach を使うとインデックス管理のミスを減らせます。
要素を逐次取得するため IndexOutOfRange の心配が減ります。
foreach (var item in arr)
{
Console.WriteLine(item);
}安全に要素を取得するパターン
配列やリストから値を安全に取り出したい場合はTry 型のメソッドや拡張メソッドを自分で用意するとよいです。
public static bool TryGetAt<t>(T[] array, int index, out T value)
{
if (index >= 0 && index < array.Length)
{
value = array[index];
return true;
}
value = default;
return false;
}</t>このようにすると呼び出し側で安全に扱えます。
例:if (TryGetAt(arr, i, out var v)) { ... }
デバッグのコツ:原因を速く特定する方法
デバッグでは次の手順が有効です。
スタックトレースを見る→該当行の変数を確認→条件を疑う、の順です。
- スタックトレースで例外発生行を特定する
- その行のインデックス変数と配列の長さをウォッチする
- 繰り返し処理なら開始値と終了条件をもう一度確認する
ログを入れて具体的な値を出力すると再現調査が早くなります。
単体テストで境界値(0やLength-1, Length)を検証するのも有効です。
実践的な注意点と良い習慣
入力データや外部から受け取る配列は必ず検証しましょう。
Nullチェックや長さチェックを怠ると別の例外につながります。
配列操作を行う場所を小さく保ち、責任を明確にすることも大事です。
関数ごとに「ここでは必ず範囲内」を前提にする設計はバグを減らします。
ユニットテストで境界をカバーする
境界値(空配列、1要素、最大要素)をテストに含めるとIndexOutOfRangeException の発生を未然に防げます。
[Test]
public void Access_OutOfRange_Throws()
{
int[] a = new int[0];
Assert.Throws<IndexOutOfRangeException>(() => { var v = a[0]; });
}まとめと実践チェックリスト
最後に、IndexOutOfRangeException を防ぐための
シンプルなチェックリストを示します。日常的に使ってください。
- 配列やリストにアクセスする前に
Length/Countを確認する forループはi < array.Lengthを基本にする- 可能なら
foreachや TryGet パターンを使う ListはArgumentOutOfRangeExceptionになる点を区別する- スタックトレースとログで発生箇所と値を確認する
これらを意識すれば多くの IndexOutOfRangeException は防げます。
初心者が最初に覚えるべき重要なポイントです。
この記事で紹介したコード例やチェック方法を参考にして
実際のコードにすぐ適用してみてください。問題の特定が早くなります。
さらに詳しい例や特定ケースの相談があれば
具体的なコードを貼っていただければより的確にアドバイスします。

#エンジニアとして、もっと自分の力を活かしたいあなたへ
「このまま今の職場にいて、成長できるんだろうか?」
C#を使っている方なら、一度はそう感じたことがあるかもしれません。
実は今、C#/.NETエンジニアの市場価値は高まっており、
年収アップ・フルリモート・自社開発企業など、選べる選択肢は確実に増えています。
もし今後、C#を活かして働きたい、あるいは開発現場で経験を積みたいとお考えなら…
自分に合った転職サービスを早めに知っておくことが大きな武器になります。
現役エンジニアからのサポート付き・無料で学べるスクール・社内SE特化の求人など、
転職支援サービスを厳選したまとめ記事をこちらで紹介しています。

ここまで読んでいただきありがとうございました。
コメント