Javaの例外処理:InputMismatchExceptionとIllegalArgumentExceptionの使い分けと設計指針
こんにちは。ゆうせいです。
新人研修中に受講者から以下の質問をいただきました。
InputMismatchExceptionとIllegalArgumentExceptionはどのように使い分ければいいですか?
今回はこの質問に答えたいと思います。
Javaでプログラムを開発していると、意図しない値が入力された際にどのようにエラーを通知すべきか迷うことがあります。特に、入力値の不整合を扱うInputMismatchExceptionとIllegalArgumentExceptionは、初心者にとって区別が難しい概念です。これらの違いを正しく理解することで、堅牢なプログラムを作成できるようになります。
InputMismatchExceptionとは
InputMismatchExceptionは、主にScannerクラスなどを用いて、期待していたデータ型と実際の入力が一致しない場合に発生する例外です。
この例外は、いわば自動販売機に硬貨ではなく紙のメモを入れたような状態を指します。機械は硬貨(数値)を期待していますが、投入されたものが紙(文字列)であったため、処理を継続できなくなります。
主な特徴は以下の通りです。
- データの型そのものが期待と異なる場合に用いられます。
- 標準ライブラリではScannerクラスのメソッド(nextIntなど)で頻繁に利用されます。
IllegalArgumentExceptionとは
IllegalArgumentExceptionは、メソッドに渡された引数が、型は合っているものの、その内容が不適切である場合に発生する例外です。
これは、自動販売機に硬貨(数値)を投入したものの、その硬貨が500円玉ではなく、存在しない「600円硬貨」であったような状態に例えられます。お金という型は正しいですが、システムが受け入れ可能な範囲(引数のルール)を超えているため、拒絶されます。
主な特徴は以下の通りです。
- 引数の値が、論理的に許容されない範囲(負の数など)である場合に用いられます。
- プログラマが明示的にメソッドの引数チェックとして投げることが一般的です。
二つの例外の使い分け
使い分けの基準は、エラーが発生したタイミングと、エラーの性質が型によるものか、それとも値の範囲によるものかに注目すると明確になります。
InputMismatchExceptionを選択すべきケース
- ユーザーからの直接的な入力を受け取る段階。
- 数値を期待しているところに文字が入力されたという、入り口での形式エラーを伝えたい場合。
IllegalArgumentExceptionを選択すべきケース
- メソッドの引数として値を受け取った後の段階。
- 型は正しいが、例えば年齢にマイナスの値が入っているなど、業務上のルールに違反している場合。
メリットとデメリット
これらの例外を適切に使い分けることには、運用上の具体的な利点と注意点があります。
適切な例外選択のメリット
- デバッグの効率化:例外の種類を見るだけで、入力形式のミスなのか、ロジック上の値の制約違反なのかを即座に判断できます。
- 呼び出し側の制御:例外ごとに異なるエラーメッセージを表示するなど、ユーザーに対して親切なフィードバックが可能になります。
例外処理の実装におけるデメリット
- コードの複雑化:細かく例外を分けるほど、try-catch文やバリデーション(検証)のコードが増加し、全体の記述量が多くなります。
- 実行速度への影響:Javaにおいて例外の生成は比較的重い処理であるため、頻繁に発生する正常系のフローに例外を組み込むと、パフォーマンスを低下させる要因となります。
まとめ
InputMismatchExceptionとIllegalArgumentExceptionの使い分けを理解することは、エラーに強いプログラムを書くための第一歩です。
学習を深めるためのステップは以下の通りです。
- まずはScannerクラスを利用して、わざと異なる型の値を入力し、InputMismatchExceptionが発生する様子を確認してください。
- 次に、メソッドの引数チェックを行い、条件を満たさない場合にthrow new IllegalArgumentExceptionを記述する練習を行ってください。
- 最後に、標準的な例外だけでなく、独自の例外(カスタム例外)を作成することで、Javaの例外機構全体の構造を体系的に学んでください。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール


