【C#】 IndexOutOfRangeException エラーの原因と対処法をわかりやすく解説

※ この記事にはアフィリエイトリンクが含まれます

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 パターンを使う
  • ListArgumentOutOfRangeException になる点を区別する
  • スタックトレースとログで発生箇所と値を確認する

これらを意識すれば多くの IndexOutOfRangeException は防げます。
初心者が最初に覚えるべき重要なポイントです。

この記事で紹介したコード例やチェック方法を参考にして
実際のコードにすぐ適用してみてください。問題の特定が早くなります。

さらに詳しい例や特定ケースの相談があれば
具体的なコードを貼っていただければより的確にアドバイスします。

#エンジニアとして、もっと自分の力を活かしたいあなたへ

「このまま今の職場にいて、成長できるんだろうか?」

C#を使っている方なら、一度はそう感じたことがあるかもしれません。

実は今、C#/.NETエンジニアの市場価値は高まっており
年収アップ・フルリモート・自社開発企業など、選べる選択肢は確実に増えています。

もし今後、C#を活かして働きたい、あるいは開発現場で経験を積みたいとお考えなら…
自分に合った転職サービスを早めに知っておくことが大きな武器になります。

現役エンジニアからのサポート付き・無料で学べるスクール・社内SE特化の求人など、
転職支援サービスを厳選したまとめ記事をこちらで紹介しています。

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

沖縄出身のエンジニアです。IT業界で5年以上の経験があり、主にC#やPHPを使って開発を行ってきました。新しい技術にも興味があり、日々学びながらスキルアップを目指しています。

コメント

コメントする

CAPTCHA


目次