Javaでの例外階層の説明

公開: 2022-03-08

「例外」という用語は「例外イベント」の略です。 Javaでは、例外は基本的に、プログラムの実行中に発生し、プログラムの通常のフローを中断させるイベントです。 例外は望ましくなく、ほとんどの場合予期しないものであり、通常は実行時またはコンパイル時に発生します。 プログラムが自然な流れで実行されるようにするには、これらの例外をすべて処理する必要があります。

ただし、例外を処理する前に、Javaに存在するさまざまな種類の例外を知っておくと役立ちます。 この記事では、Javaのさまざまなタイプの例外と、それに続く例外階層を見ていきましょう。

目次

Javaの例外階層

Javaプログラミング言語のExceptionsの階層は、Throwableクラスから始まります。これはObjectクラスに由来し、その直接のサブクラスです。Exceptionクラスは、すべてのThis Throwableクラスをさらに2つのサブクラス(ErrorとException)に分岐します。 Java例外階層をよりよく理解するためのフローチャートを次に示します。

Exceptionクラスは、Javaプログラミング言語での作業中に処理する必要がある可能性のあるすべての例外を示します。 このような例外の一般的に知られ、遭遇する例には、NullPointerException、ClassNotFoundException、IllegalArgumentExceptionなどがあります。

一方、Errorクラスは、Javaプログラムアーキテクチャのより深刻な問題を処理し、アプリケーションコード内では処理されません。 Javaでのエラーの例としては、InternalError、AssertionError、OutOfMemoryErrorなどがあります。

Javaの例外は、さらに2つのカテゴリに分類されます。

  • チェックされた例外–これらはコンパイル時の例外とも呼ばれます。
  • 未チェックの例外–これらはランタイム例外とも呼ばれます。

この時点で注意すべき重要な点の1つは、チェックされていない例外はすべてRuntimeExceptionクラスのサブクラスであるということです。 チェックされた例外とチェックされていない例外については、この記事の後半で詳しく説明します。 ただし、その前に、混乱が生じないように、エラーと例外の動作が本質的にどのように異なるかを見てみましょう。

Javaのエラーと例外–それらはどのように異なりますか?

Javaプログラミング言語の公式ドキュメントでは、エラーはJavaプログラミング中の発生として言及されており、「合理的なアプリケーションがキャッチしようとしてはならない重大な問題を示しています」。 エラーの深刻さは、このステートメントの準備方法から明らかです。 明らかに、これは、プログラムが直面する可能性のある一連の問題を指し、コードをリファクタリングするか、Javaアプリケーションアーキテクチャを変更しないと、プログラムを回復することはできません。

エラーをスローするJavaメソッドを見てみましょう。

public static void print(String S){

print(S);

}

上記のコードでは、メソッドprint()は再帰的なメソッドとして機能し、Javaのスレッドスタックで許可されている最大サイズに達するまで、何度も何度も自分自身を呼び出し続けます。 その時点で、非常に一般的なStackOverflowErrorを使用して実行を終了します。これは、次のようになります。

スレッド「メイン」の例外java.lang.StackOverflowError

StackOverflowErrorExample.print(StackOverflowErrorExample.java:3)で

上記の例が示すように、メソッドは例をスローしますが、このエラーはコード自体では処理できません。 したがって、損傷が回復不能であるため、プログラムは単に実行を終了します。 解決策として、コードを変更する必要があります。

エラーとは異なり、例外は、妥当なアプリケーションがキャッチできる条件を示します。 Javaの例外には、コンパイル時または実行時に発生する可能性のある問題が含まれます。 これらの例外は、すべてのアプリケーションで、特にテストとデバッグの段階でかなり頻繁に発生します。 その結果、Javaの例外をプログラム自体で処理して、コードが自然な流れで実行されるようにすることができます。

それでは、チェックされている例外とチェックされていない例外が何であるかを見て、Javaの例外階層についてもう少し話しましょう。

Javaでチェックされた例外とチェックされていない例外

前述のように、Javaプログラムの例外は、コンパイル時または実行時に発生する可能性があります。 これが、Javaに存在する2つの幅広いタイプの例外を提供するものです。 これらの2つの例外について詳しく見ていきます。

コンパイル時の例外

コンパイル時に発生する例外は、コンパイル時の例外と呼ばれます。 これらは、Javaプログラムで明示的にチェックし、コード自体で処理する必要があるため、チェック例外とも呼ばれます。 InterruptedException、IOExceptionなどのクラスは、チェックされた例外です。

チェックされた例外を処理できるメソッドを見てみましょう。

public void writeAFile(){

try(BufferedWriter b_w = new BufferedWriter(new FileWriter(“ myFile.txt”))){

b_w.write( "テスト");

} catch(IOException ioe){

ioe.printStackTrace();

}

}

ご覧のとおり、上記のコードのtryブロックには2つのステートメントがあります–

  • オブジェクトのインスタンス化– BufferedWriter
  • オブジェクトを使用してファイルに書き込む

これらのステートメントは両方ともIOExceptionをスローする可能性があります。 チェック例外であるIOExceptionは、呼び出し元またはメソッドのいずれかによって処理される必要があります。 上記の例では、メソッド自体の中で処理されている例外を確認できます。

ランタイム例外

コンパイル時にスローされるコンパイル時の例外とは異なり、実行時またはチェックされていない例外は「いつでも」スローされる可能性があります。これは基本的に実行時を意味します。 この結果、メソッドは、これらのチェックされていない例外を処理するために、キャッチアンドスローブロックを明示的に使用する必要はありません。 未チェックのランタイム例外を継承するクラスには、NullPointerException、ArithmeticExceptionなどがあります。

NullPointerExceptionのチェックされていない例外をスローし、以前とは異なり、コードの一部で処理されないJavaコードの一部を見てみましょう。 ここにあります:

public void writeToFile(){

try(BufferedWriter b_w = null){

b_w.write( "テスト");

} catch(IOException ioe){

ioe.printStackTrace();

}

}

上記のメソッドを呼び出すと、BufferedWriterオブジェクトがnullであるため、プログラムはNullPointerExceptionをスローします。 例外は次のようになります。

スレッド「メイン」の例外java.lang.NullPointerException

IOExceptionExample.writeToFile(IOExceptionExample.java:10)で

IOExceptionExample.main(IOExceptionExample.java:17)で

結論は

これで、Javaの例外階層を理解することについてのこのブログの終わりに到達しました。 これは、Javaでの例外と、それらの処理方法を包括的に網羅しているわけではないことに注意してください。 そのためには、より深く掘り下げて、考えられるさまざまな例外にさらして、それらがどのように機能するかを確認する必要があります。 例外はあらゆるアプリケーションの基本を形成するため、例外処理を理解することで、フルスタック開発者としてのキャリアを成功させることができます。

upGradには、専門のフルスタック開発コース–ソフトウェア開発のエグゼクティブPGプログラム–フルスタック開発の専門–があり、主にフルスタック開発に焦点を当てて、ソフトウェア開発のあらゆるニュアンスを紹介します。 コースをチェックして、おそらくすぐに席を予約することをお勧めします!

1. Javaの例外階層の最上位に存在するクラスはどれですか?

Throwableクラスは、Javaの例外階層の最上位にあります。

2. Javaに存在するさまざまな種類の例外は何ですか?

Javaは、チェックされていない例外とチェックされている例外を持っています。 チェックされた例外はコンパイル時例外とも呼ばれ、チェックされていない例外はランタイム例外とも呼ばれます。

3. Javaでは例外はどのように処理されますか?

try-catchは、Javaで例外を処理する最も簡単な方法です。 実行する主要なコードはtryブロックに配置する必要がありますが、1つ以上のcatchブロックは、コードがスローするすべての例外をキャッチします。 このメソッドは、スローされるすべてのタイプのJava例外を検出します。