try…catch命令
例外を処理する – try…catch命令- try {
- tstatements
- } catch(exclazz ex) {
- ctatements
- }
- tstatements:例外が発生する可能性がある処理
- exclazz:例外クラス
- ex:例外クラスを表す変数名
- cstatements:例外が発生した時に実行される処理
コードの中で発生するかもしれない例外をあらかじめ把握し、発生時になんらかの処理(たとえばログへの記録など)を行うことを例外処理と言います。例外処理には、try…catch…finally命令を利用します。 たとえば以下は、ファイル処理で指定のファイルが存在しなかった場合に、その旨をメッセージ出力する例です。
ExTry.java
package com.example.mynavi.exception; import java.io.FileNotFoundException; import java.io.FileReader; public class ExTry { public static void main(String[] args) { try { FileReader reader = new FileReader("C:/data.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
FileReaderクラス(java.ioパッケージ)は指定のファイルが存在しない場合に、FileNotFound例外を発生します。例外処理を行うには、まず例外を発生する可能性があるコードをtryブロックで囲みます。tryブロックの中で例外が発生した場合、処理はcatchブロックに引き継がれます(これを例外をキャッチすると言います)。
catchブロックでは「catch (例外の型 引数) { … }」の形式で受け取る例外を指定できます。複数の例外が発生する場合には、catchブロックを列記しても構いません。
catchブロックには引数を経由して例外オブジェクトが渡されますので、そのメソッドなどを利用して、具体的な例外処理を行います。ここでは例外スタックトレースを標準出力に出力しています。スタックトレースとは、例外が起こるまでのメソッドの呼び出し過程を記録した情報のことです。
例外オブジェクトの主な取得メソッド | |
---|---|
メソッド | 取得できる情報 |
getCause() | 例外の原因 |
getMessage() | 例外メッセージ |
getStackTrace() | スタックトレース |
printStackTrace() | スタックトレース(標準出力に出力) |
catchブロックは上から順に検索し、「発生した例外がcatchブロックのそれと一致した、または、発生した例外がスーパークラスである」場合に実行されます。よって、複数のcatchブロックを連ねる場合には、より下位の例外クラスを最初に、上位の例外クラスを後に記述すべきです。
例えば、すべての例外クラスのスーパークラスであるExceptionクラスを最初に書いてしまった場合、すべての例外がそこで捕捉されてしまうので、以降のcatchブロックが呼び出されることはありません。
そもそもExceptionクラスは一般的な例外を表すことから、例外処理の意味も分かりにくくなりますので、最大限利用すべきではありません。
Java SE 7以降では、マルチキャッチという機能を利用することで、複数の例外をまとめてキャッチできるようになりました。例外の型に関わらず、同じ処理を施している場合には、マルチキャッチ機能を利用することで、よりコードを簡単に記述できます。
たとえば以下はHogeException/FooException/BarExceptionをまとめてキャッチする例です。
try { ...任意の処理... } catch (HogeException | FooBarException | PicoException e) { e.printStackTrace(); }