Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのThrowableクラスとは?重要なメソッドとその使い方を実例付きで解説

Throwableクラスは、Javaにおけるすべてのエラーおよび例外のスーパークラス(親クラス)です。このクラスのインスタンスであるオブジェクトは、JVM(Java Virtual Machine)によって自動的にスローされるか、あるいはthrowステートメントによってプログラマが明示的にスローすることができます。また、catch節の引数型としても、このクラスまたはそのサブクラスを指定できます。

ThrowableにはErrorExceptionという2つの主要なサブクラスがあり、これらのインスタンスは例外的な状況が発生したことを示すために使用されます。インスタンスは例外が発生したコンテキスト内で生成され、メッセージやスタックトレースなどの関連情報を保持します。

Throwableクラスの階層構造

Errorは、OutOfMemoryErrorやStackOverflowErrorなど、アプリケーション側での回復が困難な重大な問題を表します。一方、ExceptionはIOExceptionやSQLExceptionなど、プログラムで捕捉・処理可能な異常状態を表します。Exceptionはさらに、NullPointerExceptionやArithmeticExceptionのようなRuntimeException系の非検査例外と、コンパイル時に処理が強制される検査例外に分類されます。

Throwableクラスでよく使われる例外メソッド

  • public String getMessage(): 例外に関するメッセージ文字列を返します。
  • public Throwable getCause(): 例外の原因となったThrowableオブジェクトを返します。原因が不明または存在しない場合はnullを返します。
  • public String toString(): クラス名とメッセージを組み合わせた、例外の短い説明を返します。
  • public void printStackTrace(PrintStream s): toString()による短い説明とスタックトレースを、標準エラー出力ストリーム(System.err)に出力します。

サンプルコード

class ArithmaticTest {
    public void division(int num1, int num2) {
        try {
            // ここでjava.lang.ArithmeticExceptionが発生
            System.out.println(num1 / num2);
        } catch(ArithmeticException e) {
            // 例外に関するメッセージ文字列を出力
            System.out.println("getMessage(): " + e.getMessage());
            // 例外の原因を出力
            System.out.println("getCause(): " + e.getCause());
            // クラス名 + ": " + メッセージを出力
            System.out.println("toString(): " + e.toString());
            System.out.println("printStackTrace(): ");
            // 例外の短い説明とスタックトレースを出力
            e.printStackTrace();
        }
    }
}
public class Test {
    public static void main(String args[]) {
        // ArithmaticTestオブジェクトの生成
        ArithmaticTest test = new ArithmaticTest();
        // メソッド呼び出し
        test.division(20, 0);
    }
}

実行結果

getMessage(): / by zero
getCause(): null
toString(): java.lang.ArithmeticException: / by zero
printStackTrace():
java.lang.ArithmeticException: / by zero
at ArithmaticTest.division(Test.java:5)
at Test.main(Test.java:27)

実行結果の解説

この例では、20を0で除算しようとしたため、java.lang.ArithmeticException("/ by zero")が発生します。各メソッドの出力内容は以下のとおりです。

  • getMessage(): 例外メッセージ「/ by zero」のみを返します。
  • getCause(): 原因となる例外が設定されていないため、nullを返します。
  • toString(): 「java.lang.ArithmeticException: / by zero」のように、例外クラス名とメッセージを連結した文字列を返します。
  • printStackTrace(): 例外の詳細に加え、例外が発生したメソッド呼び出しの履歴(スタックトレース)を標準エラー出力に出力します。デバッグ時に特に役立ちます。

これらのメソッドを適切に使い分けることで、例外発生時の原因特定やログ出力が効率的に行えるようになり、より堅牢なJavaアプリケーションの開発につながります。

  1. JavaのSwingWorkerクラスとは?GUIアプリで非同期処理を行う重要性と使い方を解説

    SwingWorkerクラスは、時間のかかる処理(長時間実行タスク)などをワーカースレッド上で非同期に実行し、その結果に基づいてイベントディスパッチスレッド(EDT)からSwingコンポーネントを安全に更新するための仕組みを提供します。このクラスはJava 1.6で導入されました。Swingでは、すべてのUI更新はEDT上で行う必要があります。しかし、EDT上で重い処理を直接実行すると画面がフリーズしてしまい、ユーザー体験を大きく損ないます。SwingWorkerを使えば、バックグラウンドでの処理とUIの更新を適切に分離できるため、応答性の高いデスクトップアプリケーションを実現できます。Swi

  2. JavaのSwingUtilitiesクラスとは?invokeAndWait()とinvokeLater()で実現するスレッドセーフなGUI操作

    JavaのSwingでは、コンポーネントが画面に表示された後、それらを操作できるのは「イベントディスパッチスレッド(Event Handling Thread)」と呼ばれる単一のスレッドだけです。これはSwingの重要な設計原則であり、複数のスレッドから同時にGUIを操作すると不整合や予期しない動作が発生するため、すべての描画・更新処理をこのスレッドに集約することで安全性を確保しています。開発者は、別途作成したコードブロックの参照をイベントディスパッチスレッドに渡すことができます。SwingUtilitiesクラスには、そのための2つの重要なstaticメソッド、invokeAndWait()