Javaの基礎Java

Javaの基礎:例外処理を解説(try-catch-finally)

Java例外処理解説ページのアイキャッチ画像 Javaの基礎

この記事では、Javaにおける例外処理の基本カスタム例外の作成・使用方法について学びます。基本的な例外処理の構文から、独自の例外クラスの定義と活用まで、実際のプログラム例を通じて理解を深めることができます。

はじめに

この記事のコードをコピペしてEclipseで出力結果を確認してみよう

Javaの例外処理の基本

Javaの例外処理は、プログラム実行中に発生する予期せぬ事態に対処するための仕組みです。例外は、プログラムの正常な流れを中断させる特殊な状況を表します。

例外の主な特徴:

  1. 例外クラスの階層構造: Javaの例外は、Throwableクラスを頂点とする階層構造を持っています。
  2. 検査例外と非検査例外: 例外は大きく2つのカテゴリーに分けられます。
    • 検査例外 (Exception): コンパイラが処理を強制するもの
    • 非検査例外 (RuntimeException): コンパイラが処理を強制しないもの
  1. try-catch-finally構文: 例外処理の基本的な構文です。
  2. 例外のスロー: throwキーワードを使用して意図的に例外を発生させることができます。

プログラム例1: 基本的な例外処理

BasicExceptionExample.java

Java
public class BasicExceptionExample {
    public static void main(String[] args) {
        try {
            // 危険な操作: 0で除算
            int result = 10 / 0;
            System.out.println("結果: " + result);  // この行は実行されません
        } catch (ArithmeticException e) {
            // 例外が発生した場合の処理
            System.out.println("エラー: 0で除算しました");
            System.out.println("例外メッセージ: " + e.getMessage());
        } finally {
            // 必ず実行される処理
            System.out.println("処理を終了します");
        }
    }
}

出力結果:

エラー: 0で除算しました
例外メッセージ: / by zero
処理を終了します

コードの解説:

  1. tryブロック内で0による除算を行い、意図的にArithmeticExceptionを発生させています。
  2. catchブロックでArithmeticExceptionをキャッチし、エラーメッセージを表示します。
  3. finallyブロックは例外の発生有無に関わらず必ず実行されます。

BasicExceptionExample.javaの解説

  • クラス定義
Java
public class BasicExceptionExample {
    // ...
}

BasicExceptionExample という名前の公開クラスを定義しています。

  • main メソッド
Java
public static void main(String[] args) {
    // ...
}

これはプログラムのエントリーポイントです。

  • try ブロック
Java
try {
    // 危険な操作: 0で除算
    int result = 10 / 0;
    System.out.println("結果: " + result);  // この行は実行されません
}

tryブロック内で、潜在的に例外を発生させる可能性のあるコードを記述しています。ここでは、0による除算を行っており、これは ArithmeticException を発生させます。

  • catch ブロック
Java
catch (ArithmeticException e) {
    // 例外が発生した場合の処理
    System.out.println("エラー: 0で除算しました");
    System.out.println("例外メッセージ: " + e.getMessage());
}

catchブロックは、特定の例外(ここでは ArithmeticException)が発生した場合に実行されるコードを含みます。例外が発生すると、プログラムの制御はここに移ります。

  • finally ブロック
Java
finally {
    // 必ず実行される処理
    System.out.println("処理を終了します");
}

finallyブロックは、例外が発生しても発生しなくても、必ず実行されるコードを含みます。通常、リソースの解放やクリーンアップ処理に使用されます。

このコードは、Javaの基本的な例外処理の構造を示しています:

  • try ブロック: 例外が発生する可能性のあるコードを含みます。
  • catch ブロック: 特定の例外が発生した場合の処理を定義します。
  • finally ブロック: 例外の有無に関わらず実行される処理を定義します。

この例では、0による除算を試みることで意図的に ArithmeticException を発生させています。catch ブロックでこの例外をキャッチし、エラーメッセージを表示します。finally ブロックは、例外処理の結果に関わらず実行されることを示しています。

この構造により、プログラムは予期せぬエラーに対して適切に対応し、クラッシュを防ぐことができます。また、開発者はエラーの原因を特定し、適切な対処を行うことができます。

プログラム例2: カスタム例外の使用

NegativeAgeException.java

Java
public class NegativeAgeException extends Exception {
    public NegativeAgeException(String message) {
        super(message);
    }
}

CustomExceptionExample.java

Java
public class CustomExceptionExample {
    public static void setAge(int age) throws NegativeAgeException {
        if (age < 0) {
            // 年齢が負の場合、カスタム例外をスロー
            throw new NegativeAgeException("年齢は0以上である必要があります");
        }
        System.out.println("年齢を " + age + " に設定しました");
    }

    public static void main(String[] args) {
        try {
            setAge(30);  // 正常なケース
            setAge(-5);  // 例外が発生するケース
        } catch (NegativeAgeException e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

出力結果:

年齢を 30 に設定しました
エラー: 年齢は0以上である必要があります

NegativeAgeException.javaの解説

  • クラス定義
Java
public class NegativeAgeException extends Exception {
    // ...
}

NegativeAgeException という名前の公開クラスを定義しています。このクラスは Exception クラスを継承しています。

  • コンストラクタ
Java
public NegativeAgeException(String message) {
    super(message);
}

このクラスのコンストラクタを定義しています。以下の特徴があります:

  • public アクセス修飾子を使用しているため、このコンストラクタは他のクラスからアクセス可能です。
  • 引数として String 型の message を受け取ります。
  • super(message) を呼び出しています。これは親クラス(Exception)のコンストラクタを呼び出し、メッセージを渡しています。

このコードは、カスタム例外クラスの基本的な実装を示しています:

  1. 例外クラスの継承: Exception クラス(または他の適切な例外クラス)を継承することで、独自の例外クラスを作成しています。
  2. メッセージの受け渡し: コンストラクタで受け取ったメッセージを親クラスのコンストラクタに渡しています。これにより、例外がスローされたときに詳細なエラーメッセージを提供することができます。
  3. 命名規則: 例外クラスの名前は通常 “Exception” で終わります。この場合、負の年齢に関する例外を表すため、NegativeAgeException と命名されています。

このようなカスタム例外クラスを作成することで、アプリケーション固有のエラー状況を明確に表現し、より適切な例外処理を行うことができます。例えば、年齢を扱うメソッドで負の値が入力された場合に、この例外をスローすることができます。

CustomExceptionExample.javaの解説

  • クラス定義
Java
public class CustomExceptionExample {
    // ...
}

CustomExceptionExample という名前の公開クラスを定義しています。

  • setAge メソッド
Java
public static void setAge(int age) throws NegativeAgeException {
    if (age < 0) {
        // 年齢が負の場合、カスタム例外をスロー
        throw new NegativeAgeException("年齢は0以上である必要があります");
    }
    System.out.println("年齢を " + age + " に設定しました");
}

このメソッドは以下の特徴を持っています:

  • static メソッドとして定義されています。
  • メソッド宣言に throws NegativeAgeException が含まれており、このメソッドが NegativeAgeException をスローする可能性があることを示しています。
  • 年齢が負の場合、throw キーワードを使用して NegativeAgeException をスローしています。
  • main メソッド
Java
public static void main(String[] args) {
    try {
        setAge(30);  // 正常なケース
        setAge(-5);  // 例外が発生するケース
    } catch (NegativeAgeException e) {
        System.out.println("エラー: " + e.getMessage());
    }
}

main メソッドでは:

  • tryブロック内で setAge メソッドを呼び出しています。
  • 正常なケース(30)と例外が発生するケース(-5)の両方をテストしています。
  • catchブロックNegativeAgeException をキャッチし、エラーメッセージを表示しています。

このコードは、カスタム例外の使用例を示しています:

  1. 例外のスロー: setAge メソッド内で、条件に応じてカスタム例外をスローしています。
  2. 例外の宣言: メソッド宣言で throws キーワードを使用して、潜在的な例外をコンパイラと呼び出し元に通知しています。
  3. 例外のキャッチ: main メソッド内の try-catch ブロックで、スローされた例外をキャッチし処理しています。

カスタム例外を使用することで、コードの可読性と保守性が向上し、エラー処理をより効果的に行うことができます。

まとめ

  • 例外処理はJavaプログラミングにおいて重要な概念で、予期せぬエラーに対処するために使用されます。
  • try-catch-finally構文を使用して、エラーを捕捉し適切に処理することができます。
  • カスタム例外を作成することで、アプリケーション固有のエラー状況を明確に表現できます。
  • 基本的な例外処理とカスタム例外の使用方法を理解することで、より堅牢なプログラムを作成できます。

Javaの例外処理を適切に利用することで、プログラムの信頼性と保守性が向上します。基本的な例外処理では、try-catchブロックを使用してエラーを捕捉し、適切な対応を行います。これにより、プログラムが予期せぬ状況で突然終了することを防ぎます。

例外処理を適切に実装することで、デバッグが容易になり、ユーザーエクスペリエンスの向上にもつながります。エラーメッセージを適切に設定し、ログを取ることで、問題の迅速な特定と解決が可能になります。

この記事で学んだ技術を活用することで、より安全で信頼性の高いJavaアプリケーションを開発する能力が身につきます。

未経験でもWEBスキルを取得したい方
  • Javaコース
    Javaプログラミングを基礎から応用まで、体系的に学べる実践的なカリキュラムが特徴です。「マインクラフト」を通じてJavaの基本文法とフレームワークの概念を学びます。また、実際のプロジェクト開発を通じて、データベース連携やWebアプリケーション開発のスキルを身につけることができます。

コメント

タイトルとURLをコピーしました