この章では例外処理について説明します。
例外処理については少し説明しましたが、例えば数字を入れなくてはいけない場面で数字以外のものが入れられたら、「数字の入力が必須です」と例外処理が実行されます。
説明済みの星座のプログラムを見てみましょう。結果は以下の通りです。 例えばこのプログラムで数字以外の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メソッドに戻って例外処理を行います。
結果は以下のようになります。