この章では例外処理について説明します。
例外とは、プログラムの実行過程で発生するエラーのことを言います。
0による除算や配列の添え字の数を超えて実行しようとするとエラーが起こります。
例外が起こったときに、予想外の動きをしないためには例外処理を行う必要があります。
例外処理をすることで プログラムが途中で中断されることなく続けることができるメリットがあります。
では例をみてみましょう。 C#には例外を処理するためのクラスが備わっているのですが、それがExceptionクラスです。
このクラスを基本として、様々な例外処理が行われます。
例えばこの例のDivideByZeroExceptionクラスは Exception クラスの子クラスですが、0で除算した際の例外処理を行います。 この例の処理の場合はcatchの引数にと記述し、次にcatchのブロック内にという形式で記述します。
Messageはプロパティですが、ここに例外の文字列が格納されています。
結果は以下の通りです。 例外クラスはDivideByZeroExceptionだけではないので、他の例外も紹介します。 この例では配列の要素数が3なのに4つ入れようとしているので、例外が発生します。
この例外を扱うクラスはIndexOutOfRangeExceptionです。
配列の要素数を超えてデータを入れようとすると、この例外クラスが実行されます。 結果は以下の通りです。 今まで2つの例外 を見てきましたが、catchは1つだけしか書くことができないわけではなく、何個でも書くことが出来ます。 以下のように複数のcatch文を書く事が出来ます。 では次の説明に移ります。
今までは2つの例外 を別個に書いていましたが、
これらに代わって
「Exception」を使うことで
どの例外でも補足することが
可能になります。
Exceptionクラスは今まで説明してきた例外クラスの親クラスに当たります。
では例をみてみましょう。 結果は以下の通りです。 次は例外をプログラマが明示的に投げる方法について説明します。
明示的に例外を投げるにはtryのブロック内にという構文で書きます。 では例をみてみましょう。 この例は変数がnullであればthrowで例外をcatchに送っています。
throw 文は例外が起こる箇所に挿入します。
ArgumentNullExceptionクラスは値がnullである可能性があるプログラムに使用されます。
結果は以下の通りです。
タグ: Exception
例外処理について知ろう
この章では例外処理について説明します。
例外処理については少し説明しましたが、例えば数字を入れなくてはいけない場面で数字以外のものが入れられたら、「数字の入力が必須です」と例外処理が実行されます。
説明済みの星座のプログラムを見てみましょう。結果は以下の通りです。 例えばこのプログラムで数字以外のaなどを入力すると「数字入力」と出力されます。
コマンドプロンプトで入力する場合には例え3などと入力しても文字列を入力していることになるので、これをで整数に変換するわけですが、この時、aなどのように数値に変換できない文字列形式の場合には例外が発生します。
例外が発生するとcatch以降のブロックに実行が移ります。 例外が発生する状況はこの数字以外以下のようなケースが考えられます。
〇例えば配列の要素数を5つで宣言したにも関わらず6つ目にデータを入れようとしたとき
〇ファイルを開くときにそのファイル自体が見つからなかったとき
〇 0で割り算をしたとき
〇メモリを消費しすぎて、足らなくなったとき
では配列の例外の例を見てみましょう。 この例は配列の要素数を3つで宣言しているのにそれを超えた添え字にデータを入れようとしたので例外が発生します。
例外の流れはブロックの中で例外が発生するとcatchのブロックに処理が移ります。
発生した例外が catchの引数の例外クラスと一致していた場合、catchブロック内に処理が移ります。
しかし例外が発生したとしてもcatchの中のという例外に一致したものでないと例外処理が行われません。
一致したのならばcatchの中のeに例外の内容が入ります。
は例外処理を行うクラスになります。
JavaTM Platform Standard Edition 6 APIを見ますと配列のサイズを超えた場合にその例外をスローしてくれるクラスと書いてあります。
JavaTM Platform Standard Edition 6 APIはとても便利なので分からないことがありましたら参考にしてください。
どんなに経験のあるプログラマでもすべてのクラスを把握するのは不可能なので、このJavaTM Platform Standard Edition 6 APIは手放すことはできません。 例外が成功したのならば と正常に例外をキャッチ出来ていることが分かります。
このように例外処理を行うことでプログラムが途中で終わってしまうことを防ぐことが出来ます。
以下の例では例外を使っていませんので、途中で強制終了させられます。 出力結果は以下の通りです。 もちろん、すべての配列の箇所で例外処理を行っていては例外処理だらけになってしまうので、例外が発生しそうな箇所だけ例外処理を施すのがいいでしょう。
では他の例外クラスの説明をします。
星座の例のNumberFormatExceptionはNumberFormatExceptionというクラスであり、文字列を整数に変換するときに、aなどのように数値に変換できない文字列の形式の場合に例外が発生します。
次はIOExceptionクラスについて説明します。
IOExceptionクラスはコマンドライン入力やファイル入力などの入出力の時に発生する例外に対して例外処理を行うクラスです。
先ほどのSeizaクラスの中にBufferedReaderクラスがありますが、このクラスはIOExceptionの例外を発生する可能性がありますので、必ず例外処理でキャッチする記述をしないといけません。 例外処理をしないと以下のエラーが表示されます。
では次の例に進みます。 ArithmeticExceptionクラスは0で割ろうとしたときに発生する例外です。 結果は次の通りです。 では次の例に進みます。 Exceptionクラスはすべての例外クラスの親クラスになります。
ですので、例えばArithmeticExceptionクラスが行っている例外処理も上の例のようにExceptionクラスで代用することが出来ます。
次はメソッドの中で例外が発生した時の例外処理の方法について説明します。 tryのブロックの中でhairetsuメソッドを呼んでいます。
もしhairetsuメソッドの中で例外が発生する可能性があるのならば例のようにメソッド名の右横にを付け加えます(この例ではスペースの都合で2行に分けて書いています)。
この例の場合には配列の要素数を超えた添え字にデータを入れようとしているので例外が発生します。
例外が発生したのならばmainメソッドに戻って例外処理を行います。
結果は以下のようになります。