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

Javaでカスタム例外を作成する方法|検査例外と非検査例外の違いを解説


Javaにおけるカスタム例外とは

Javaでは、開発者が独自に定義した例外クラスを作成できます。これらは「ユーザー定義例外」や「カスタム例外」と呼ばれ、アプリケーション固有のエラー状況をわかりやすいメッセージとともに表現するために活用されます。

カスタム例外を作成するには、ExceptionクラスやRuntimeExceptionクラスなど、既存の例外クラスを継承します。エラーメッセージを表示したい場合は、toString()メソッドをオーバーライドするか、スーパークラスの引数付きコンストラクタにString型のメッセージを渡します。

MyException(String msg){
    super(msg);
}
または、
public String toString(){
    return " MyException [Message of your exception]";
}

続いて、この例外を発生させたい箇所では、作成したカスタム例外クラスのインスタンスを生成し、throwキーワードを使って例外をスローします。

MyException ex = new MyException();
if(条件式……){
    throw ex;
}

カスタム検査例外とカスタム非検査例外

カスタム例外を設計する際には、以下のルールを押さえておきましょう。

  • すべての例外クラスは、Throwableクラスの子クラスである必要があります。
  • 「ハンドルまたは宣言ルール(Handle or Declare Rule)」によって対処が強制される検査例外(checked exception)を作成したい場合は、Exceptionクラスを継承します。
  • 実行時例外(runtime exception/unchecked exception)を作成したい場合は、RuntimeExceptionクラスを継承します。

例:カスタム検査例外

次のJavaプログラムは、カスタム検査例外の作成方法を示したものです。入力された名前にa〜z以外の文字が含まれている場合に、NotProperNameExceptionをスローする仕組みになっています。

import java.util.Scanner;
class NotProperNameException extends Exception {
    NotProperNameException(String msg){
        super(msg);
    }
}
public class CustomCheckedException {
    private String name;
    private int age;
    public static boolean containsAlphabet(String name) {
        for (int i = 0; i < name.length(); i++) {
            char ch = name.charAt(i);
            if (!(ch >= 'a' && ch <= 'z')) {
                return false;
            }
        }
        return true;
    }
    public CustomCheckedException(String name, int age){
        if(!containsAlphabet(name)&&name!=null) {
            String msg = "Improper name (Should contain only characters between a to z (all small))";
            NotProperNameException exName = new NotProperNameException(msg);
            throw exName;
        }
        this.name = name;
        this.age = age;
    }
    public void display(){
        System.out.println("Name of the Student: "+this.name );
        System.out.println("Age of the Student: "+this.age );
    }
    public static void main(String args[]) {
        Scanner sc= new Scanner(System.in);
        System.out.println("Enter the name of the person: ");
        String name = sc.next();
        System.out.println("Enter the age of the person: ");
        int age = sc.nextInt();
        CustomCheckedException obj = new CustomCheckedException(name, age);
        obj.display();
    }
}

コンパイル時の例外

このプログラムをコンパイルすると、検査例外がtry-catchで捕捉されておらず、throws句でも宣言されていないため、次のコンパイルエラーが発生します。

CustomCheckedException.java:24: error: unreported exception NotProperNameException; must be caught or declared to be thrown
    throw exName;
    ^
1 error

つまり、Exceptionクラスを継承した検査例外をスローする場合は、try-catchブロックで捕捉するか、メソッドシグネチャにthrows宣言を追加する必要があります。

例:カスタム非検査例外

カスタム例外が継承するクラスをRuntimeExceptionに変更するだけで、例外は実行時にスローされるようになります。

class NotProperNameException extends RuntimeException {
    NotProperNameException(String msg){
        super(msg);
    }
}

先ほどのプログラムのNotProperNameExceptionクラスを上記のコードに置き換えて実行すると、今度はコンパイルエラーは発生せず、プログラムの実行時に次のような実行時例外が出力されます。

実行時例外の出力例

Enter the name of the person:
Krishna1234
Enter the age of the person:
20
Exception in thread "main" july_set3.NotProperNameException: Improper name (Should contain only characters between a to z (all small))
    at july_set3.CustomCheckedException.<init>(CustomCheckedException.java:25)
    at july_set3.CustomCheckedException.main(CustomCheckedException.java:41)

まとめ

カスタム例外を活用することで、アプリケーション固有のエラー状況を明確なメッセージとともに表現できます。入力値のバリデーションなど、呼び出し元に確実な対処を求めたいケースではExceptionクラスを継承した検査例外を、予期しない実行時の異常にはRuntimeExceptionクラスを継承した非検査例外を選択するのが基本です。用途に応じて適切に使い分けましょう。

  1. Rubyでカスタム例外を作成する方法【初心者向けガイド】

    Rubyでは、独自の例外クラスを簡単に作成できます。この記事では、カスタム例外を作るための基本的な手順を、コード例とともにわかりやすく解説します。 1. 新しいクラスを作成する Rubyにおいて、例外も他のオブジェクトと同じくクラスとして定義されています。新しい種類の例外を作りたい場合は、StandardError、あるいはそのサブクラスを継承したクラスを定義するだけでOKです。 class MyError < StandardError end raise MyError 慣例として、新しく作る例外クラスの名前は「Error」で終わるように命名します。また、カスタム例外をモジュ

  2. Rubyで例外をrescue(捕捉)する方法を徹底解説

    アプリケーション内で発生した例外は、そのまま放置するとコールスタックの最上部まで伝播し、アプリケーション全体をクラッシュさせてしまいます。これを防ぐために、Rubyではrescueキーワードを使って例外を捕捉(キャッチ)します。さらに、Rubyで例外を捕捉する際には、どの例外クラスを対象とするかを具体的に指定することも可能です。begin raise この例外は捕捉されます! rescue StandardError => e puts Rescued: #{e.inspect} end補足:raiseを呼び出す際に例外クラスを指定しなかった場合、RubyはデフォルトでRunti