C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でIndexOutOfRangeException(インデックス範囲外例外)をキャッチする方法

IndexOutOfRangeExceptionとは

IndexOutOfRangeExceptionは、配列の有効な範囲(境界)外のインデックスを使って要素にアクセスしようとした際に発生する例外です。C#の配列はインデックスが0から始まるため、要素数が5の配列の場合、有効なインデックスは0~4となります。

例外が発生するコードの例

まず、次のように5つの要素を持つint型の配列を用意します。

int[] n = new int[5] {66, 33, 56, 23, 81};

この配列に対して、インデックス5以上の値で要素へアクセスしようとすると、IndexOutOfRangeExceptionがスローされます。

for (j = 0; j < 10; j++) {
    Console.WriteLine("Element[{0}] = {1}", j, n[j]);
}

上記の例では、存在しないインデックス5~9へのアクセスを試みているため、次のエラーが発生します。

System.IndexOutOfRangeException: Index was outside the bounds of the array.

try-catchで例外をキャッチする完全なコード例

using System;

namespace Demo {
    class MyArray {
        static void Main(string[] args) {
            try {
                int[] n = new int[5] {66, 33, 56, 23, 81};
                int i, j;
                // エラー:IndexOutOfRangeException が発生する
                for (j = 0; j < 10; j++) {
                    Console.WriteLine("Element[{0}] = {1}", j, n[j]);
                }
                Console.ReadKey();
            } catch (System.IndexOutOfRangeException e) {
                Console.WriteLine(e);
            }
        }
    }
}

実行結果

Element[0] = 66
Element[1] = 33
Element[2] = 56
Element[3] = 23
Element[4] = 81
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Demo.MyArray.Main (System.String[] args) [0x00019] in <6ff1dbe1755b407391fe21dec35d62bd>:0

ループがインデックス5に到達した時点で例外がスローされ、catchブロックによって捕捉され、エラーメッセージが出力されます。これにより、プログラムが異常終了することなく処理を続行できます。

例外を未然に防ぐには

try-catchによる例外処理も有効ですが、根本的な対策としては、配列のLengthプロパティを使ってループの上限を設定する方法があります。

for (j = 0; j < n.Length; j++) {
    Console.WriteLine("Element[{0}] = {1}", j, n[j]);
}

このように記述すれば、ループは常に配列の要素数以内で実行されるため、IndexOutOfRangeExceptionの発生自体を防ぐことができます。固定の数値(10など)ではなくLengthプロパティを利用することが、安全な配列操作の基本です。

  1. 【初心者向け】C++の例外処理の仕組みを徹底解説!try・catch・throwの基本から独自例外の作成まで

    C++における例外処理(Exception Handling)とは、プログラムの実行中に発生するエラー(ランタイムエラー)を適切に処理するための仕組みです。例外とは、実行時に送出されるイベントのことを指し、C++ではすべての標準例外が std::exception クラスを基底クラスとして定義されています。 もし例外を捕捉しなければ、プログラムは例外メッセージを出力した後に異常終了してしまいます。例外はハンドリング可能なランタイムエラーであり、適切に処理することでプログラムの堅牢性を大きく向上させることができます。 標準例外クラスの階層構造 C++標準では、例外は <exception&

  2. Chromebookでスクリーンショットを撮る方法を徹底解説!ショートカットキーから拡張機能・スタイラスまで

    Chromebookは、ユーザーの作業や生活をより快適にするために設計された、シンプルで扱いやすいマシンです。しかし、比較的新しいデバイスであるため、まだ知られていない機能も少なくありません。WindowsやMacでのスクリーンショットの撮り方はご存じの方が多いでしょうが、Chromebookでは同じ方法は使えません。とはいえ、難しいどころか、実はもっと簡単で、スクリーンショットをカスタマイズできるオプションも複数用意されています。Google Chromebookでスクリーンショットを撮るすべての方法をご紹介する前に、まず覚えておきたいキーボードのキーについて説明します。 Chromebo