static void processInput() {
// ユーザーからの入力を処理するコード(整数以外の入力がある可能性がある)
try {
// 仮に整数以外の入力があるとする処理(例: 文字列を整数に変換する)
String userInput = "abc"; // 仮の入力
int convertedValue = Integer.parseInt(userInput); // 整数に変換
// この行まで到達すると、正常に処理が完了したと仮定
} catch (NumberFormatException e) {
// 整数以外の入力が検出された場合、新しいNumberFormatExceptionをスロー
throw new NumberFormatException("整数以外の入力が検出されました");
}
}
この例では、String
型の変数 userInput
を整数に変換しようとしています。もし userInput
が整数以外の文字列を含んでいる場合、Integer.parseInt
メソッドは NumberFormatException
をスローします。この例外が捕捉され、新しい NumberFormatException
が生成されてスローされます。
例外の伝播とスローを組み合わせて使う
「例外の伝播」と「例外のスロー」を組み合わせることで、より柔軟なエラー処理が可能となります。以下に、これらの概念を組み合わせた際の解説を提供します。
例外の伝播とスローの組み合わせ
- 例外の伝播(Exception Propagation):
- 上位メソッドへの伝播: メソッド内で例外が発生した場合、そのメソッドがその例外をキャッチせずにスローすると、その例外は呼び出し元のメソッドに伝播します。このプロセスが上位のメソッドや呼び出し元に続くことがあります。
- 異なるクラスやモジュールへの伝播: 例外が複数のメソッドやクラスをまたいで発生した場合、例外はこれらの境界を越えて伝播します。これにより、エラーが発生したコンテキストで例外を処理する柔軟性が向上します。
- 例外のスロー(Exception Throwing):
- 特定のエラーコードや情報と共にスロー: メソッド内で問題が発生した場合、適切なエラーコードや情報と共に新しい例外を作成し、
throw
キーワードを使用して呼び出し元にスローします。これにより、呼び出し元がエラーの詳細を把握しやすくなります。 - カスタム例外の使用: アプリケーションで特定の条件に対するカスタム例外クラスを作成し、それをスローすることで、より具体的で理解しやすいエラー情報を提供できます。
- 特定のエラーコードや情報と共にスロー: メソッド内で問題が発生した場合、適切なエラーコードや情報と共に新しい例外を作成し、
例外の伝播とスローの組み合わせの利点
- 可読性と保守性の向上: 適切に例外を伝播させることで、エラーが発生したコンテキストで例外を処理できます。これにより、コードがより理解しやすくなり、将来の保守性が向上します。
- 局所的なエラーハンドリング: メソッド内で問題が発生した場合に局所的なエラーハンドリングを行いつつ、それを呼び出し元に通知することができます。これにより、適切なエラー処理が異なる階層で行われます。
- 柔軟なエラーハンドリングポリシー: エラーの発生箇所で適切なエラーハンドリングポリシーを採用できます。一部のエラーは局所的に処理し、他のエラーは呼び出し元に伝播させることができます。
例外の伝播とスローの組み合わせにより、システム全体で一貫性のあるエラーハンドリングアプローチを確立することが可能です。