Javaで独自の例外クラスを作成すべき場面と実装方法を徹底解説
Javaでは、アプリケーション固有のエラー状況を正確に表現するために、独自の例外クラス(ユーザー定義例外)を作成することが推奨されます。標準ライブラリの例外だけでは表現しきれないビジネスロジ上のエラーを明確に伝えることで、コードの可読性・保守性・デバッグ効率が大きく向上します。
ユーザー定義例外を作成すべき場面
- 標準例外では表現できない、アプリケーション固有のエラー状態を扱う場合
- 例外オブジェクトに追加情報(例:不足金額、エラーコードなど)を持たせたい場合
- エラーの意味をドメイン用語で明確に表現したい場合
- 特定のビジネスルール違反を、専用の例外として区別したい場合
独自の例外クラスを作成する際のルール
例外クラスを自作する際には、以下のポイントを必ず押さえておきましょう。
- すべての例外クラスは、Throwableクラスの子クラスである必要があります。
- 検査例外(Checked Exception)を作成したい場合は、Exceptionクラスを継承します。検査例外は「ハンドルまたは宣言ルール(Handle or Declare Rule)」により、呼び出し元でのtry-catchによる捕捉、またはthrows句による宣言がコンパイラによって強制されます。
- 実行時例外(Runtime Exception / Unchecked Exception)を作成したい場合は、RuntimeExceptionクラスを継承します。
基本的な例外クラスの定義方法
独自の例外クラスは、Exceptionクラスを継承するだけで簡単に定義できます。
class MyException extends Exception {
}
このようにExceptionクラスを継承して作成された例外は、検査例外として扱われます。以降では、より実践的な例として「残高不足」を表現するユーザー定義例外を見ていきましょう。
実践例:InsufficientFundsException(残高不足例外)
以下のInsufficientFundsExceptionクラスは、Exceptionクラスを継承したユーザー定義の検査例外です。不足金額をフィールドとして保持し、getterメソッドで取得できる点がポイントです。
// ファイル名:InsufficientFundsException.java
import java.io.*;
class InsufficientFundsException extends Exception {
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
// ファイル名:CheckingAccount.java
class CheckingAccount {
private double balance;
private int number;
public CheckingAccount(int number) {
this.number = number;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException {
if(amount <= balance) {
balance -= amount;
}
else {
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance() {
return balance;
}
public int getNumber() {
return number;
}
}
// ファイル名:BankDemo.java
public class BankDemo {
public static void main(String [] args) {
CheckingAccount c = new CheckingAccount(101);
System.out.println("Depositing $500...");
c.deposit(500.00);
try {
System.out.println("\nWithdrawing $100...");
c.withdraw(100.00);
System.out.println("\nWithdrawing $600...");
c.withdraw(600.00);
} catch(InsufficientFundsException e) {
System.out.println("Sorry, but you are short $" + e.getAmount());
e.printStackTrace();
}
}
}
コードのポイント
withdraw()メソッドでは、引き出し額が残高を超えた場合にthrowキーワードを使ってInsufficientFundsExceptionをスローします。- メソッド宣言に
throws InsufficientFundsExceptionを付けることで、検査例外であることを呼び出し元に明示しています。 - 呼び出し元の
main()メソッドではtry-catchブロックで例外を捕捉し、getAmount()メソッドで不足金額を取得して表示しています。
実行結果
Depositing $500... Withdrawing $100... Withdrawing $600... Sorry, but you are short $200.0 InsufficientFundsException at CheckingAccount.withdraw(BankDemo.java:32) at BankDemo.main(BankDemo.java:53)
このように、ユーザー定義例外を活用することで、「残高不足」という具体的なエラー状況を型として表現でき、例外オブジェクトに不足金額といった文脈情報を持たせることも可能になります。単なるメッセージ文字列以上の情報を例外に埋め込める点こそ、独自例外クラスを作る最大のメリットと言えるでしょう。
-
Javaのfinalクラスとは?継承を禁止する仕組みと使い方を徹底解説
Javaにおいて、クラスにfinal修飾子を付けて宣言する最大の目的は、そのクラスがサブクラス化(継承)されることを防ぐことです。クラスがfinalとして宣言されると、どのクラスもそのクラスを継承できなくなり、finalクラスの機能や振る舞いを拡張・変更することが不可能になります。finalクラスの基本構文finalクラスの宣言は非常にシンプルです。クラス名の前にfinalキーワードを付けるだけです。public final class Test { // クラスの本体 }このように宣言されたTestクラスに対して、以下のような継承を試みるとコンパイルエラーが発生します。// コンパイ
-
Pythonでユーザー定義例外を作成する方法を具体例とともに解説
Pythonでは、コードが異常な動作をするとエラーや例外(Exception)が発生し、プログラムの実行が途中で中断されます。こうした状況に対応するために、Pythonはtry-except文による例外処理の仕組みを提供しています。標準で用意されている主な例外には、ArithmeticError、AssertionError、AttributeError、ImportErrorなどがあります。しかし、標準の例外だけでは表現しきれないアプリケーション固有のエラー状態もあります。そこで役立つのが「ユーザー定義例外」です。この記事では、独自の例外クラスを作成して使う方法を、具体的なコード例とともにわ