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

Javaにおける例外(Exception)とエラー(Error)の違いを徹底解説

Javaにおいて、例外(Exception)エラー(Error)はどちらも Throwable クラスのサブクラスです。しかし、両者には明確な違いがあり、堅牢なアプリケーションを開発するうえで、それぞれの特性を正しく理解することは非常に重要です。

エラー(Error)とは

エラーは、主にシステムリソースの不足によって発生する深刻な問題を示します。この種の問題はアプリケーション側でキャッチ(捕捉)すべきものではなく、基本的にプログラマーが対処できる範囲を超えています。代表的な例としては、システムクラッシュやメモリ不足(OutOfMemoryError)などが挙げられます。

エラーはほとんどの場合、実行時(ランタイム)に発生するため、非チェック(unchecked)型に分類されます。

例外(Exception)とは

例外は、実行時およびコンパイル時に発生しうる問題であり、主に開発者が記述したコードに起因します。例外は大きく次の2種類に分類されます。

  • チェックド例外(Checked Exception): コンパイル時に検査され、try-catch による処理または throws 宣言が必須となる例外。例:IOExceptionSQLException
  • 非チェックド例外(Unchecked Exception): 実行時に発生する例外で、事前の処理は強制されません。例:NullPointerExceptionArithmeticException

エラーと例外の比較表

No.項目エラー(Error)例外(Exception)
1種類非チェック型(unchecked)として分類されるチェック型と非チェック型の両方に分類される
2パッケージjava.lang.Error に属するjava.lang.Exception に属する
3回復可能性回復不可能(irrecoverable)回復可能(recoverable)
4発生タイミングコンパイル時には発生しない実行時・コンパイル時の両方で発生しうる
5具体例OutOfMemoryErrorIOErrorNullPointerExceptionSQLException

エラーの発生例

次のコードは、終了条件のない無限再帰呼び出しによってスタック領域を使い果たし、StackOverflowError が発生する例です。

public class ErrorExample {
    public static void main(String[] args){
        recursiveMethod(10);
    }
    public static void recursiveMethod(int i){
        while(i != 0){
            i = i + 1;
            recursiveMethod(i);
        }
    }
}

実行結果

Exception in thread "main" java.lang.StackOverflowError
    at ErrorExample.ErrorExample(Main.java:42)

例外の発生例

次のコードは、整数をゼロで除算したことで ArithmeticException が発生する例です。このような例外は、事前のチェックや try-catch による処理で回避・回復できます。

public class ExceptionExample {
    public static void main(String[] args){
        int x = 100;
        int y = 0;
        int z = x / y;
    }
}

実行結果

java.lang.ArithmeticException: / by zero
    at ExceptionExample.main(ExceptionExample.java:7)

まとめ

エラーは JVM やシステムレベルの深刻な問題であり、アプリケーションでの復旧は想定されていません。一方、例外は開発者のコードに起因する問題であり、適切なハンドリングによって回復可能です。この違いを理解し、例外は適切に処理し、エラーは無理に捕捉しないという設計方針を心がけることが、信頼性の高いJavaアプリケーション開発の第一歩となります。

  1. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って

  2. JavaのExceptionクラスとErrorクラスの違いを徹底解説

    JavaにおけるException(例外)クラスとError(エラー)クラスは、どちらもjava.lang.Throwableクラスのサブクラスです。しかし、両者には重要な違いがあります。例外はプログラム側で捕捉・処理できるのに対し、エラーはアプリケーションで対処すべきではない重大な問題を表します。 ExceptionとErrorの共通点 両クラスともThrowableクラスを継承しており、throw文によってスロー可能なオブジェクトという点では共通しています。ただし、その性質と扱い方には大きな違いがあります。 主な違い 1. 処理の可否 例外は実行時に発生する論理的なエラーを表すオブジ