【C#】配列の範囲外エラー(IndexOutOfRangeException)の原因と対処法を解説

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

C#で配列を扱っていて「範囲外のエラー」が出て困っていませんか?

・配列の添字が0から始まることを忘れてしまう
forループの終了条件を1つ多くしてしまう
・多次元配列やジャグ配列で混乱してしまう

結論から言うと、ほとんどの「C# 配列 範囲外 エラー」は添字の扱いか長さの確認不足が原因です。

・配列長をLengthで確認する
・foreachやListなど安全な代替を使う
・デバッガや例外メッセージで発生箇所を特定する

この記事を読むと、IndexOutOfRangeExceptionの典型的な原因と具体的な対処法を学べますので、ぜひ最後までご覧ください。

目次

配列の範囲外エラーとは何か

まず、発生するエラーの正体を押さえましょう。C#では添字が無効なときにIndexOutOfRangeExceptionが投げられます。たとえば、長さ3の配列に対してarr[3]にアクセスするとエラーになります。これは添字が0から2までだからです。

なぜ起きるのか

主な原因は次の通りです。添字の範囲を超えるアクセス、オフバイワン(1つずれている)ミス、ループ条件の誤り、配列の初期化忘れなどです。

また、多次元配列や配列の配列(ジャグ配列)では各次元や各要素の長さが異なるため、想定外の範囲外が発生しやすくなります。

よくある具体例と原因の説明

ここからは具体的なコード例で、どのようにして範囲外アクセスが起きるかを説明します。初心者が陥りやすいパターンを順に見ていきましょう。

例1: 基本的なオフバイワンエラー

次のコードはよくあるミスの代表例です。配列長が3なのにfor文でi <= arr.Lengthとしてしまう場合です。

int[] arr = new int[3];
for (int i = 0; i <= arr.Length; i++)
{
    arr[i] = i;
}

この場合、最後のループでiは3になり、arr[3]にアクセスしようとして例外が起きます。チェックは必ず i < arr.Length にしてください。

例2: 多次元配列の誤解

多次元配列とジャグ配列は挙動が違います。次のコードは誤解からエラーが出る例です。

int[,] matrix = new int[2,3];
int x = matrix[1,3]; // ここでエラー

2行3列の配列では列の最大インデックスは2です。二次元配列の添え字は0から始まる点に注意してください。

例3: ジャグ配列で各行の長さが異なる場合

ジャグ配列(配列の配列)では各要素が独自の長さを持ちます。ループで共通の長さを使うと範囲外になります。

int[][] jagged = new int[2][];
jagged[0] = new int[2];
jagged[1] = new int[4];
for (int i = 0; i < jagged.Length; i++)
{
    for (int j = 0; j < jagged[0].Length; j++)
    {
        jagged[i][j] = i + j; // i==1, j>=2 のときエラー
    }
}

内側のループで jagged[0].Length を使っていますが、行ごとに長さが違うため安全ではありません。必ず jagged[i].Length を使いましょう。

効果的な対策と使い分け

では、具体的にどう直せばよいかを説明します。初心者でも実践しやすい手順を示します。

配列長を常にチェックする

ループやアクセス前に Length プロパティで範囲を確認します。条件は i < arr.Length を基本にします。

また、負の添字を使わないように注意してください。添字が負になるケースは少ないですが、計算ミスで起きます。

foreachを使って安全にループする

要素を読み書きするだけならforeachが安全です。添字操作を避けられるのでオフバイワンを防げます。

int[] arr = new int[] {1,2,3};
foreach (int v in arr)
{
    Console.WriteLine(v);
}

ただしforeachでは配列の要素自体を直接変更することはできません。要素を書き換える必要がある場合はforを使います。

List<T>やコレクションを使う

要素数が変動する場合は配列よりListを使うと安全です。ListはAddやRemoveでサイズ管理を内部で行います。

var list = new System.Collections.Generic.List<int>();
list.Add(1);
int v = list[0];

Listでも添字アクセスは可能なので、インデックスを使う際はLengthではなく Count をチェックしてください。

デバッガと例外メッセージを活用する

Visual Studioのデバッガを使えば、例外発生時のスタックトレースや変数の状態を確認できます。どの配列、どの添字が問題か特定しやすくなります。

IndexOutOfRangeExceptionのメッセージとスタックトレースを確認して、該当行の前後の値をチェックしましょう。

実践的なチェックリストと予防策

ここでは日常的に使えるチェックリストを示します。コーディング時に習慣化するとミスが減ります。

  • 配列宣言時に意図したサイズを確認する
  • ループ条件は常に < を使う(<= を避ける)
  • 多次元配列は各次元の最大値を確認する
  • ジャグ配列では各行のLengthを使う
  • foreachやListで安全に処理する選択を検討する

トラブルシューティングの流れ

もしエラーが出たら、落ち着いて次の流れで原因を特定します。順序を守ると早く解決できます。

  1. エラーメッセージとスタックトレースを読む
  2. 問題の行を特定し、配列と添字の値を確認する
  3. ループ条件や初期化箇所を見直す
  4. 必要ならデバッガで変数の中身を追う
  5. foreachやListに置き換えて安全性を高める

まとめと学んだことの振り返り

C#の配列範囲外エラーは多くが添字の扱いミスで発生します。0始まり、Lengthの範囲、ループ条件の基本を習得すれば防げることがほとんどです。

実際の対処法としては、ループ条件の修正、foreachやListの活用、デバッガでの原因特定が有効です。ジャグ配列や多次元配列は特に注意しましょう。

この記事を参考にして、次回からはIndexOutOfRangeExceptionに悩まされることを減らしてください。コーディングの習慣を少し変えるだけで大きな効果が得られます。

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

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

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

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

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

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

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

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

この記事を書いた人

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

コメント

コメントする

CAPTCHA


目次