Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
try / catch / finally / throw
例外処理の基本構文です。『try』ブロックで例外が発生する可能性のある処理を囲み、『catch』ブロックで例外を捕捉して対処します。『finally』ブロックは例外の有無にかかわらず必ず実行されます。
構文
// 基本的な例外処理の構文です。
try {
// 例外が発生する可能性のある処理
} catch (ExceptionType e) {
// 例外が発生したときの処理
} finally {
// 例外の有無にかかわらず実行される処理
}
// 複数の例外を個別に捕捉します。
try {
// 処理
} catch (IOException e) {
// IO例外への対処
} catch (NumberFormatException e) {
// 数値変換例外への対処
}
// 複数の例外を1つのcatchで捕捉します(Java 7以降)。
try {
// 処理
} catch (IOException | NumberFormatException e) {
// 複数の例外をまとめて処理
}
// 例外を意図的にスローします。
throw new IllegalArgumentException("値が不正です。");
// チェック例外をメソッドの呼び出し元に伝播させます。
public void readFile() throws IOException {
// IOExceptionが発生する可能性のある処理
}
主な例外クラス一覧
| クラス | 概要 |
|---|---|
| Exception | チェック例外の基底クラスです。throws 宣言が必要です。 |
| RuntimeException | 非チェック例外の基底クラスです。throws 宣言は不要です。 |
| IOException | 入出力操作に関するチェック例外です。 |
| NullPointerException | null オブジェクトへのアクセス時にスローされます。 |
| IllegalArgumentException | 引数が不正なときにスローされる非チェック例外です。 |
| NumberFormatException | 文字列を数値に変換できないときにスローされます。 |
| ArrayIndexOutOfBoundsException | 配列の範囲外アクセス時にスローされます。 |
サンプルコード
// 基本的な例外処理です。
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("エラー: " + e.getMessage()); // 『エラー: / by zero』と出力されます。
} finally {
System.out.println("finallyブロックが実行されました。");
}
// 複数の例外を捕捉します。
String input = "abc";
try {
int num = Integer.parseInt(input);
} catch (NumberFormatException e) {
System.out.println("数値に変換できません: " + input);
} catch (Exception e) {
System.out.println("予期しないエラー: " + e.getMessage());
}
// throw で例外をスローします。
public static int divide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("除数は0にできません。");
}
return a / b;
}
// throws で呼び出し元に例外を伝播させます。
public static String readFirstLine(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
return br.readLine();
}
概要
Javaの例外は「チェック例外」と「非チェック例外」に分かれます。チェック例外(Exception を直接継承するクラス)は try-catch で捕捉するか throws で宣言して呼び出し元に伝播させることがコンパイラによって強制されます。非チェック例外(RuntimeException のサブクラス)は任意で対処します。
『finally』ブロックはリソースの解放(ファイルのクローズなど)に使われてきましたが、Java 7以降は『try-with-resources』を使うことでより簡潔に書くことができます。例外クラスの継承関係に注意して、より具体的な例外クラスを先に catch するようにしてください。
リソースを自動クローズするには『try-with-resources / AutoCloseable』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。