例外処理

[戻る] [前に] [次に]

例外とは

Java では、プログラムを実行する最中に発生するエラーを 例外(exception)として扱うことができます。例外には例えば、0で割り算をした、メモリが枯渇した、存在しないファイルを開こうとしたなどがあります。

例外をキャッチする(try, catch, finally)

FileReader() は、指定したファイルが存在しない場合に FileNotFoundException 例外を発生させます。これは、FileReader() のマニュアルに下記のように記述してあることから分かります。

public FileReader(String fileName)
    throws FileNotFoundException

try は、例外を発生させる可能性のある処理を呼び出す場合に用います。try { ... } の間で例外が発生した場合、catch を用いてこの例外を捕捉します。下記の例では、FileNotFoundException 例外が発生した場合に、その内容を標準出力に書き出します。このような例外発生時の処理を 例外ハンドラ と呼びます。

try {
    FileReader in = new FileReader("data.txt");
} catch (FileNotFoundException e) {
    System.out.println(e);
}

catch は例外発生時に投げられる 例外オブジェクト に応じて複数記述することができます。いずれの catch にも該当しない例外やファイルクローズなどの後処理を行うために、finally を用います。finally の部分は、たとえ try 部分で return を行っても実行されます。

try {
    :
} catch (TestAException e) {
    :
} catch (TestBException e) {
    :
} finally {
    :
}

例外が発生した場合、try { ... } catch の間の残りの処理はスキップされます。下記の例では、例外が発生した場合 (1) (2) (4) (5) (6) の処理が実行され、(3) の処理はスキップされます。例外が発生しない場合は (1) (2) (3) (5) (6) の処理が実行されます。

System.out.println("(1)");
try {
    System.out.println("(2)");
    FileReader in = new FileReader("data.txt");  ← 例外発生!!
    System.out.println("(3)");                   ← スキップされる
} catch (FileNotFoundException e) {
    System.out.println("(4)");
} finally {
    System.out.println("(5)");
}    
System.out.println("(6)");

例外を投げる(throw, throws)

throw を用いて例外を投げることができます。例外を投げるメソッドを定義する場合は、throws を用いて、そのメソッドが例外を投げる可能性があることを明示しておきます。throws 宣言されたメソッドは、try catch で例外を補足しないと、コンパイル時にエラーとなります。

§ThrowTest.java
class MyException extends Exception {
    public String errMsg;
    MyException(String msg) { errMsg = msg; }
}

class ThrowTest {
    public static void main(String[] args) {
        try {
            methodA();
        } catch (MyException e) {
            System.out.println(e.errMsg);
        }
    }
    static void methodA() throws MyException {
        MyException e = new MyException("エラー発生!!");
        throw e;
    }
}

例外オブジェクト(Exception)

例外オブジェクトは次のようなクラス階層を持ちます。

Object
└□Throwable
 ├□Error
 │├□
 └□Exception
  ├□RuntimeException
  │├□
  ├□

それぞれのクラス(およびそのサブクラス)は次のように分類できます。

クラス説明
ErrorJavaVM で検出される致命的エラー。例外ハンドラを記述しても処理を継続できないことが多い。OutOfMemory(メモリ枯渇)など。
RuntimeExceptionJavaの処理上発生するエラー。例外ハンドラは省略可能。ArithmeticException(ゼロ除算)、IllegalArgumentException(引数不正)、NullPointerException(NULLポインタ参照)、ArrayIndexOutOfBoundsException(不正インデックスによる配列参照)など。
Exception通常の例外。例外ハンドラを記述しないとコンパイルエラーとなる。

http://www.tohoho-web.com/java/exception.htm
初版:2004年6月26日、最終更新:2004年6月26日
[戻る] [前に] [次に]