try-catchを使って例外を扱う
Javaでは例外の処理方法が2通りあります。
1つは自分で処理(catch)する、もう1つは他人(メソッドの呼び出し元)に任せる(throw)のいずれかです。
下のsampleは自分で処理する(catch)場合で、try文を使って記述します。
FileInputStreamクラスがthrowする可能性が有るFileNotFoundExceptionをcatchしています。
import java.io.*;
class ExamTry {
public static void main(String args[]) {
String status = null;
try {
FileInputStream fis = new FileInputStream("text.txt");
status = "ok";
} catch(IOException ioe) {
status = ioe.toString();
} finally {
if ( status == null ) {
status = "unknown error";
}
System.out.println(status);
}
}
}
| <実行結果> カレントディレクトリにファイル"text.txt"がある場合、コンソール画面に ok と表示されます。 カレントディレクトリにファイル"text.txt"が無い場合、コンソール画面に java.io.FileNotFoundException: text.txt (No such file or directory ) と表示されます。 |
< finally >
finally句は必ず実行されます。
・ファイルが存在し、OKが出力された場合
・ファイルが存在せず、IOExceptionが発生した場合
・IOException以外の例外やエラーが発生し、例外をcatchできなかった場合
・try のブロックの処理が return, break,
continue によって途中で中断された場合
<ErrorとException>
Javaでは不測の事態の処理としてError classとException
classの2つに大別されています。
Error classには例えばNoClassDefFoundErrorなど、アプリケーションでは扱えない、もしくは扱うべきではないエラーが定義されていますので、プログラムではその処理を記述しません。
Exception classはプログラムで扱う事が可能なエラーが定義されています。
Exception(例外)にはチェックされなければいけないExceptionとチェックされなくても構わないExceptionが有ります。
例えばIOExceptionはその発生の有無をチェックする記述が必要ですし、ArrayIndexOutOfBoundsExceptionは発生のチェックが記述されなくても構いません。
発生の有無のチェックを記述しなくても構わないクラスは、java.lang.RuntimeExceptionの下に配置されています。
通常プログラムで扱う例外処理(エラー)はjava.lang.Exceptionを継承するクラスだけです。
java.lang.Object
|
+--java.lang.Throwable
|
+--java.lang.Error
|
+--java.lang.Exception
|
+--java.lang.RuntimeException