C#のIndexOutOfRangeExceptionの対処法
C#でプログラムを書いていると、配列やリストなどのコレクションの範囲外の要素にアクセスしようとしたときに、「IndexOutOfRangeException」
インデックスが配列の境界外です。
というエラーが発生することがあります。
この記事では、そのエラーに対する対処方法を5つ紹介します。
それぞれのケースでエラーが出るソースコードと、それを対処したソースコードを示し、その解説を行います。
C#のエラー一覧はコチラ
-
【C# sharp】よく発生するエラー一覧10選 エラーの発生原因と対処方法
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
ケース1: 配列の長さを確認する
配列の範囲外にアクセスしようとすると、IndexOutOfRangeExceptionが発生します。
それは配列の長さを確認することです。例をみてみましょう!
エラーが発生するソースコード
1 2 3 4 5 6 7 8 9 10 |
using System; class Program { static void Main() { int[] array = new int[5]; Console.WriteLine(array[5]); } } |
上記のコードでは、配列の範囲外の要素にアクセスしようとしているため、IndexOutOfRangeExceptionが発生します。
対処後のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; class Program { static void Main() { int[] array = new int[5]; for (int i = 0; i < array.Length; i++) { Console.WriteLine(array[i]); } } } |
対処後のコードでは、forループの終了条件を配列の長さ(array.Length)にしています。
したがって、配列の範囲外にアクセスすることはありません。
出力結果
0 0 0 0 0
ケース2: 範囲チェックを行う
また、アクセスしようとするインデックスが配列の範囲内にあることを確認することもできます。
エラーが発生するソースコード
1 2 3 4 5 6 7 8 9 10 |
using System; class Program { static void Main() { int[] array = new int[5]; Console.WriteLine(array[10]); } } |
上記のコードでは、配列の範囲外の要素にアクセスしようとしているため、IndexOutOfRangeExceptionが発生します。
対処後のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; class Program { static void Main() { int[] array = new int[5]; int index = 4; if (index >= 0 && index < array.Length) { Console.WriteLine(array[index]); } } } |
このコードでは、indexが配列の範囲内にあることを確認してから配列にアクセスしています。
そのため、範囲外の要素にアクセスすることはなく、IndexOutOfRangeExceptionは発生しません。
出力結果
0
ケース3: Try/Catchを使用する
Try/Catchブロックを使用して、エラーが発生したときの処理を記述することもできます。
エラーが発生するソースコード
1 2 3 4 5 6 7 8 9 10 |
using System; class Program { static void Main() { int[] array = new int[5]; Console.WriteLine(array[10]); } } |
上記のコードでは、配列の範囲外の要素にアクセスしようとしているため、IndexOutOfRangeExceptionが発生します。
対処後のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; class Program { static void Main() { int[] array = new int[5]; try { Console.WriteLine(array[10]); } catch (IndexOutOfRangeException ex) { Console.WriteLine("Caught an exception: " + ex.Message); } } } |
このコードでは、tryブロック内でIndexOutOfRangeExceptionが発生すると、すぐにcatchブロックが実行され、エラーメッセージが表示されます。
したがって、プログラムはクラッシュせずに続行されます。
出力結果
Caught an exception: Index was outside the bounds of the array.
ケース4: リストの範囲チェックを行う
リストでも、範囲外の要素にアクセスしようとすると、同じくIndexOutOfRangeExceptionが発生します。
しかし、リストの場合は、Countプロパティを使用して範囲チェックを行うことができます。
エラーが発生するソースコード
1 2 3 4 5 6 7 8 9 10 11 |
using System; using System.Collections.Generic; class Program { static void Main() { List list = new List() {1, 2, 3, 4, 5}; Console.WriteLine(list[10]); } } |
上記のコードでは、リストの範囲外の要素にアクセスしようとしているため、IndexOutOfRangeExceptionが発生します。
対処後のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; using System.Collections.Generic; class Program { static void Main() { List list = new List() {1, 2, 3, 4, 5}; int index = 4; if (index >= 0 && index < list.Count) { Console.WriteLine(list[index]); } } } |
このコードでは、indexがリストの範囲内にあることを確認してからリストにアクセスしています。
そのため、範囲外の要素にアクセスすることはなく、IndexOutOfRangeExceptionは発生しません。
出力結果
5
ケース5: Indexerを使って安全にアクセスする
Indexerを使用して、範囲外の要素にアクセスしたときにデフォルト値を返すようにする方法もあります。
エラーが発生するソースコード
1 2 3 4 5 6 7 8 9 10 |
using System; class Program { static void Main() { int[] array = new int[5]; Console.WriteLine(array[10]); } } |
上記のコードでは、配列の範囲外の要素にアクセスしようとしているため、IndexOutOfRangeExceptionが発生します。
対処後のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; using System.Collections.Generic; public class SafeList { private List _list; public SafeList(List list) { _list = list; } public T this[int index] { get { if (index >= 0 && index < _list.Count) { return _list[index]; } else { return default(T); } } } } class Program { static void Main() { var safeList = new SafeList(new List() {1, 2, 3, 4, 5}); Console.WriteLine(safeList[10]); } } |
このコードでは、新しいSafeListクラスを作成し、そのインデクサーで範囲チェックを行っています。
範囲外のインデックスにアクセスしようとすると、インデクサーはデフォルト値(この場合は0)を返します。
したがって、IndexOutOfRangeExceptionは発生しません。
出力結果
0
KindleUnlimited会員であれば、全ての本をご覧頂けます。 Linqを理解すれば、C#プログラミングの世界が変わる 第1版
まとめ
C#では、配列やリストの範囲外の要素にアクセスしようとすると、IndexOutOfRangeExceptionが発生します。
これを防ぐためには、範囲チェックを行ったり、try/catchブロックを使用したり、インデクサーをオーバーライドするなどの方法があります。
これらの方法を適切に使用することで、IndexOutOfRangeExceptionを予防し、アプリケーションの安定性を向上させることができます。
プログラミングにおいては、エラーを予防することが重要です。
それにより、ユーザー体験を向上させ、アプリケーションの信頼性を確保することができます。
しかし、すべてのエラーを予防することは不可能です。
したがって、エラーが発生した場合の適切な処理も同様に重要です。
これらのテクニックを学び、自分のプロジェクトで活用してみてください。
それにより、より良いソフトウェアを開発することができます。
最後まで読んで頂き、ありがとうございました。少しでもお役にたてたなら幸いです!
C#のエラー一覧はコチラ
-
【C# sharp】よく発生するエラー一覧10選 エラーの発生原因と対処方法
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る