Javaグローバル例外ハンドラ

Javaグローバル例外ハンドラー

1. 概要

このチュートリアルでは、Javaのグローバル例外ハンドラーに焦点を当てます。 まず、例外の基本と例外処理について説明します。 次に、グローバル例外ハンドラーを包括的に見ていきます。

一般的な例外の詳細については、Exception Handling in Javaを参照してください。

2. 例外とは何ですか?

An exception is an abnormal condition that arises in a code sequence at runtime or at compile time.この異常な状態は、プログラムがJavaプログラミング言語のセマンティック制約に違反した場合に発生します。

Exceptions that occur during the compile time are checked exceptions.これらの例外は、Exceptionクラスの直接のサブクラスであり、コードでこれらの例外を処理する必要があります。

Another type of exceptions are the unchecked exceptions. The compiler does not check for these exceptions during the compile time.これらの例外は、Exceptionクラスを拡張するRuntimeExceptionクラスの直接のサブクラスです。

また、コードで実行時例外を処理する必要はありません。

3. 例外ハンドラー

Javaは堅牢なプログラミング言語です。 堅牢にするコア機能の1つは、例外処理フレームワークです。 これは、プログラムが単にクラッシュするのではなく、エラー時に正常に終了できることを意味します。

Whenever an exception occurs, an Exception object is constructed、JVMまたはコードを実行するメソッドのいずれかによる。 このオブジェクトには、例外に関する情報が含まれています。 Exception handling is a way of handling this Exception object.

3.1. try-catchブロック

次の例では、tryブロックに、例外をスローする可能性のあるコードが含まれています。 catchブロックには、この例外を処理するためのロジックが含まれています。

catchブロックは、tryブロックのコードが生成するExceptionオブジェクトをキャッチします。

String string = "01, , 2010";
DateFormat format = new SimpleDateFormat("MM, dd, yyyy");
Date date;
try {
    date = format.parse(string);
} catch (ParseException e) {
    System.out.println("ParseException caught!");
}

3.2. throwおよびthrowsキーワード

または、メソッドは例外を処理する代わりにスローすることもできます。 つまり、Exceptionオブジェクトを処理するロジックは別の場所に記述されています。

通常、呼び出しメソッドはそのような場合に例外を処理します。

public class ExceptionHandler {

    public static void main(String[] args) {

        String strDate = "01, , 2010";
        String dateFormat = "MM, dd, yyyy";

        try {
            Date date = new DateParser().getParsedDate(strDate, dateFormat);
        } catch (ParseException e) {
            System.out.println("The calling method caught ParseException!");
        }
    }
}

class DateParser {

    public Date getParsedDate(String strDate, String dateFormat) throws ParseException {
        DateFormat format = new SimpleDateFormat(dateFormat);

        try {
            return format.parse(strDate);
        } catch (ParseException parseException) {
            throw parseException;
        }
    }

}

次に、例外を処理する一般的な方法として、グローバル例外ハンドラーについて検討します。

4. グローバル例外ハンドラ

RuntimeExceptionのインスタンスの処理はオプションです。 その結果、実行時に長いスタックトレースを取得するためのウィンドウが開いたままになります。 これを処理するには、Java provides the UncaughtExceptionHandler interfaceThreadクラスには、これが内部クラスとして含まれています。

このインターフェースに加えて、Java 1.5 release also introduced a static method setDefaultUncaughtExceptionHandler() in the Thread class。 このメソッドの引数は、UncaughtExceptionHandlerインターフェースを実装するハンドラークラスです。

さらに、このインターフェースはメソッドuncaughtException(Thread t, Throwable e)を宣言します。 指定されたキャッチされなかった例外eが原因で、指定されたスレッドtが終了したときに呼び出されます。 実装クラスはこのメソッドを実装し、これらのキャッチされない例外を処理するためのロジックを定義します。

実行時にArithmeticExceptionをスローする次の例を考えてみましょう。 インターフェイスUncaughtExceptionHandlerを実装するクラスHandlerを定義します。

このクラスは、メソッドuncaughtException()を実装し、キャッチされない例外を処理するロジックを定義します。

public class GlobalExceptionHandler {

    public static void main(String[] args) {

        Handler globalExceptionHandler = new Handler();
        Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
        new GlobalExceptionHandler().performArithmeticOperation(10, 0);
    }

    public int performArithmeticOperation(int num1, int num2) {
        return num1/num2;
    }
}

class Handler implements Thread.UncaughtExceptionHandler {

    private static Logger LOGGER = LoggerFactory.getLogger(Handler.class);

    public void uncaughtException(Thread t, Throwable e) {
        LOGGER.info("Unhandled exception caught!");
    }
}

ここでは、現在実行中のスレッドがメインスレッドです。 したがって、そのインスタンスは、発生した例外とともにメソッドuncaughtException()に渡されます。 次に、クラスHandlerがこの例外を処理します。

同じことが未処理のチェック例外にも当てはまります。 これの簡単な例も見てみましょう。

public static void main(String[] args) throws Exception {
    Handler globalExceptionHandler = new Handler();
    Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
    Path file = Paths.get("");
    Files.delete(file);
}

ここで、Files.delete()メソッドはチェックされたIOException,をスローし、これはさらにmain()メソッドシグネチャによってスローされます。 Handlerは、この例外もキャッチします。

このように、UncaughtExceptionHandlerは、実行時に未処理の例外を管理するのに役立ちます。 ただし、breaks the idea of catching and handling the exception close to the point of originです。

5. 結論

この記事では、例外とは何か、そして例外を処理する基本的な方法は何かを理解するために時間をかけました。 また、グローバル例外ハンドラーはThreadクラスの一部であり、キャッチされなかったランタイム例外を処理することを確認しました。

次に、ランタイム例外をスローし、グローバル例外ハンドラーを使用して処理するサンプルプログラムを見ました。

この記事のサンプルコードはover on GitHubにあります。