Exceptionクラスを新人エンジニアに解説

こんにちは。ゆうせいです。
今回は、JavaのExceptionクラスについて解説します!
Exceptionクラスは、Javaでエラーや異常な状態(例外)を表現するための基本クラスです。Exceptionクラスを理解することで、例外処理や独自の例外の作成について深く学べます。


Exceptionクラスとは?

Exceptionクラスは、Javaの標準ライブラリで提供される例外のスーパークラスです。
例外は、プログラムの実行中に発生する異常を表現し、try-catchで適切に処理することが求められます。Exceptionクラスを継承したクラスを使うことで、さまざまな状況に応じたエラーを扱うことができます。


Exceptionクラスの基本構造

継承関係

Exceptionクラスは、以下の階層構造に属しています。

java.lang.Object
   ↳ java.lang.Throwable
       ↳ java.lang.Exception
           ↳ (サブクラス:IOException, SQLException など)
  • Throwable: すべてのエラーや例外のスーパークラス。
  • Exception: チェック例外(Checked Exception)を表すクラス。
  • RuntimeException: 実行時例外(Unchecked Exception)のスーパークラス。

Exceptionの種類

1. チェック例外(Checked Exception)

  • コンパイル時に例外処理が必要な例外
  • サブクラス例: IOException, SQLException
import java.io.File;
import java.io.FileReader;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader(new File("example.txt")); // ファイルがない場合、例外発生
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

2. 実行時例外(Unchecked Exception)

  • コンパイル時に例外処理が不要な例外
  • サブクラス例: NullPointerException, ArithmeticException
public class RuntimeExceptionExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        System.out.println(numbers[5]); // 配列の範囲外で例外発生
    }
}

3. エラー(Error)

  • ExceptionではなくErrorクラスを継承するエラー。
  • 主に、プログラムで回復できない重大な問題(例: JVMのクラッシュ)。
  • サブクラス例: OutOfMemoryError, StackOverflowError

Exceptionクラスの基本的な使い方

1. try-catchで例外処理

Exceptionを直接使用する場合、try-catchブロックを使って例外を処理します。

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 例外発生
        } catch (Exception e) {
            System.out.println("エラーが発生しました: " + e.getMessage());
        }
    }
}

2. 独自の例外を作成

Exceptionクラスを継承して、独自の例外を作成できます。

例:独自例外の作成

class MyException extends Exception {
    public MyException(String message) {
        super(message); // 親クラスのコンストラクタを呼び出す
    }
}

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            throw new MyException("これは独自の例外です");
        } catch (MyException e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

出力:

エラー: これは独自の例外です

3. 例外のスローとキャッチ

throwで例外をスローし、throwsでメソッドが例外をスローする可能性を宣言します。

例:例外をスローするメソッド

public class ThrowsExample {
    public static void main(String[] args) {
        try {
            checkAge(-1); // 年齢が不正な場合、例外が発生
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }

    public static void checkAge(int age) throws Exception {
        if (age < 0) {
            throw new Exception("年齢は0以上でなければなりません");
        }
        System.out.println("年齢: " + age);
    }
}

Exceptionクラスの主なメソッド

メソッド説明
getMessage()例外メッセージを取得します。
printStackTrace()例外のスタックトレースを出力します。
toString()例外の文字列表現を返します。
getCause()例外の原因を取得します。

例:スタックトレースを表示

public class ExceptionMethodExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0;
        } catch (Exception e) {
            e.printStackTrace(); // エラーの詳細を表示
        }
    }
}

Exceptionのメリットと注意点

メリット

  1. エラーの局所化try-catchでエラー処理を明確に分離。
  2. 回復可能なエラーの処理:例外をキャッチして適切に対応。
  3. コードの保守性向上:独自例外でエラーを明確に分類可能。

注意点

  1. 乱用は避ける:不要な例外処理はコードを複雑にする。
  2. 正しい例外の使用:適切な例外(IOExceptionNullPointerExceptionなど)を選ぶ。
  3. 例外の丸投げthrowsで例外を投げ続けると、呼び出し元の処理が複雑になる。

練習問題

問題:入力値のバリデーション

  1. ユーザーから整数値を入力させる。
  2. 入力値が負の数の場合、独自例外NegativeNumberExceptionをスロー。
  3. 入力値が適切な場合は、その値を表示。

ヒント

  • 独自例外を作成。
  • Scannerで値を取得。

まとめと次のステップ

JavaのExceptionクラスは、エラーや異常を適切に処理するための基盤となるクラスです。
これを理解することで、安全で堅牢なプログラムを作成できるようになります。

次に学ぶと良いテーマ:

  1. RuntimeExceptionとErrorの違い:例外とエラーを区別。
  2. 例外チェーン:別の例外の原因として例外をラップする方法。
  3. ログの活用:例外を記録してトラブルシューティングに役立てる。

ぜひ、例外を活用して安全なプログラム作成に挑戦してみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。