言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Java辞典

  1. トップページ
  2. Java辞典
  3. try / catch / finally / throw

try / catch / finally / throw

対応: Java 1.0(1996)

例外処理の基本構文です。『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入出力操作に関するチェック例外です。
NullPointerExceptionnull オブジェクトへのアクセス時にスローされます。
IllegalArgumentException引数が不正なときにスローされる非チェック例外です。
NumberFormatException文字列を数値に変換できないときにスローされます。
ArrayIndexOutOfBoundsException配列の範囲外アクセス時にスローされます。

サンプルコード

sample_TryCatchFinally.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

class TryCatchFinally {
    static int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("除数は0にできません。");
        }
        return a / b;
    }

    static String readFirstLine(String path) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path));
        return br.readLine();
    }

    public static void main(String[] args) {
        // 基本的な例外処理です
        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 で例外をスローします
        try {
            System.out.println(divide(10, 2)); // 『5』と出力されます。
            divide(10, 0); // IllegalArgumentExceptionがスローされます。
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage()); // 『除数は0にできません。』と出力されます。
        }
    }
}
TryCatchFinally.java
javac TryCatchFinally.java
java TryCatchFinally
エラー: / by zero
finallyブロックが実行されました。
数値に変換できません: abc
5
除数は0にできません。

概要

Javaの例外は「チェック例外」と「非チェック例外」に分かれます。チェック例外(Exception を直接継承するクラス)は try-catch で捕捉するか throws で宣言して呼び出し元に伝播させることがコンパイラによって強制されます。非チェック例外(RuntimeException のサブクラス)は任意で対処します。

『finally』ブロックはリソースの解放(ファイルのクローズなど)に使われてきましたが、Java 7以降は『try-with-resources』を使うことでより簡潔に書くことができます。例外クラスの継承関係に注意して、より具体的な例外クラスを先に catch するようにしてください。

リソースを自動クローズするには『try-with-resources / AutoCloseable』を使用してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。