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