コンパイラによって生成された例外を調べる
- 10 分
例外は、.NET ランタイムまたはプログラム内のコードによって生成されます。 例外の種類は、例外の原因となるコードによって異なります。
コンパイラにより生成された例外
.NET ランタイムは、基本的な操作が失敗したときに例外をスローします。 ランタイム例外とそのエラー条件の簡単な一覧を次に示します。
-
ArrayTypeMismatchException: 要素の実際の型が配列の実際の型と互換性がないため、配列が特定の要素を格納できない場合にスローされます。 -
DivideByZeroException: 整数値を 0 で除算しようとするとスローされます。 -
FormatException: 引数の形式が無効な場合にスローされます。 -
IndexOutOfRangeException: インデックスが 0 未満の場合、または配列の境界外にある場合に、配列のインデックス作成が試行されたときにスローされます。 -
InvalidCastException: 基本型からインターフェイスまたは派生型への明示的な変換が実行時に失敗した場合にスローされます。 -
NullReferenceException: 値が null のオブジェクトを参照しようとした場合にスローされます。 -
OverflowException: チェックされたコンテキストの算術演算がオーバーフローしたときにスローされます。
コンパイラによって生成される例外のコード サンプル
次のコード サンプルは、コンパイラによって生成された例外を引き起こすコードの例を示しています。
ArrayTypeMismatchException
配列内に間違った型の要素を格納しようとすると、 ArrayTypeMismatchException 型の例外がスローされます。 次の例では、文字列配列に数値を格納しようとすると、 ArrayTypeMismatchException 例外がスローされます。
string[] names = { "Dog", "Cat", "Fish" };
Object[] objs = (Object[])names;
Object obj = (Object)13;
objs[2] = obj; // ArrayTypeMismatchException occurs
DivideByZeroException
整数または 10 進数を 0 で除算しようとすると、 DivideByZeroException 型の例外が発生します。 次の例では、整数除算を実行するときに DivideByZeroException 例外をスローします。
int number1 = 3000;
int number2 = 0;
Console.WriteLine(number1 / number2); // DivideByZeroException occurs
注
浮動小数点値を 0 で除算しても、例外はスローされません。IEEE 754 算術の規則に従って、正の無限大、負の無限大、または数値 (NaN) が得られます。
フォーマット例外
引数の形式が無効な場合、または複合書式指定文字列が整形式でない場合、 FormatException 型の例外が発生します。 次の例では、文字列を整数に変換しようとすると、 FormatException 例外がスローされます。
int valueEntered;
string userValue = "two";
valueEntered = int.Parse(userValue); // FormatException occurs
IndexOutOfRangeException
IndexOutOfRangeException型の例外は、配列またはコレクションの範囲外にあるインデックスの要素にアクセスしようとするとスローされます。 次の例では、values1配列の最後の要素をvalues2配列の最後の要素に割り当てようとすると、IndexOutOfRangeException例外がスローされます。
int[] values1 = { 3, 6, 9, 12, 15, 18, 21 };
int[] values2 = new int[6];
values2[values1.Length - 1] = values1[values1.Length - 1]; // IndexOutOfRangeException occurs
InvalidCastException
無効なキャストまたは明示的な変換を試みると、 InvalidCastException 型の例外がスローされます。 次の例では、文字列型のobjectをint変数にキャストしようとしたときに、InvalidCastExceptionをスローします。
object obj = "This is a string";
int num = (int)obj;
NullReferenceException
値が null の型のメンバーにアクセスしようとすると、 NullReferenceException 型の例外がスローされます。 2 つの例を示します。 最初の例では、null 配列の要素にアクセスしようとすると、 NullReferenceException がスローされます。 2 番目の例では、null 文字列のメソッドにアクセスしようとすると、 NullReferenceException がスローされます。
int[] values = null;
for (int i = 0; i <= 9; i++)
values[i] = i * 2;
string? lowCaseString = null;
Console.WriteLine(lowCaseString.ToUpper());
OverflowException
OverflowException型の例外は、算術演算がターゲット データ型の範囲外の結果を割り当てようとしたときに発生します。 次の例では、decimal値 400 をbyte変数に変換しようとすると、OverflowException例外がスローされます。
decimal x = 400;
byte i;
i = (byte)x; // OverflowException occurs
Console.WriteLine(i);
まとめ
このユニットで覚えておく必要があるいくつかの重要な点を次に示します。
- 操作が失敗すると、.NET ランタイムによって例外がスローされます。
- 例外の種類は、例外の原因となるコードによって異なります。
- アプリケーションでランタイム例外をキャッチする必要があります。