【Java】InputMismatchExceptionについて
InputMismatchExceptionとは?
InputMismatchExceptionは、Javaの標準ライブラリの一部である「java.util」パッケージに属する例外クラスです。この例外は、Scanner
クラスがデータを入力する際に、指定された型と一致しない入力が検出された場合にスローされます。
例えば、Scanner
クラスで整数を期待しているのに文字列が入力された場合、この例外が発生します。
エラーの原因
InputMismatchExceptionが発生する主な原因を以下に示します。
- 入力の型が異なる場合: 期待される型と一致しないデータを入力した。
- フォーマットエラー: 浮動小数点数を期待している場合に「1,23」のようなカンマを含む値を入力した。
- 空の入力: データが提供されていない状態で入力操作を行った。
- ロケールの違い: 小数点の区切り文字がシステムのロケール設定と一致しない。
実例と解決方法
整数の入力時のエラー
問題のコード:
import java.util.Scanner;
public class InputMismatchExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("整数を入力してください:");
int number = scanner.nextInt(); // 整数を期待
System.out.println("入力された値: " + number);
}
}
発生条件:「abc」のような文字列を入力すると例外がスローされます。
解決方法:入力値を検証するためにhasNextInt()
メソッドを使用します。
import java.util.Scanner;
public class InputMismatchExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("整数を入力してください:");
if (scanner.hasNextInt()) {
int number = scanner.nextInt();
System.out.println("入力された値: " + number);
} else {
System.out.println("無効な入力です。整数を入力してください。");
}
}
}
浮動小数点数の入力時のエラー
問題のコード:
import java.util.Scanner;
public class DoubleInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("小数を入力してください:");
double number = scanner.nextDouble(); // 小数を期待
System.out.println("入力された値: " + number);
}
}
発生条件:「1,23」のようなカンマ付きの値を入力すると例外がスローされます。
解決方法:正しいフォーマットで入力するか、ロケールを変更します。
import java.util.Scanner;
import java.util.Locale;
public class DoubleInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
System.out.println("小数を入力してください (例: 1.23):");
if (scanner.hasNextDouble()) {
double number = scanner.nextDouble();
System.out.println("入力された値: " + number);
} else {
System.out.println("無効な入力です。小数を入力してください。");
}
}
}
空の入力の処理
問題のコード:
import java.util.Scanner;
public class EmptyInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("データを入力してください:");
String input = scanner.nextLine(); // 空行でも例外はスローされませんが、その後の処理が問題になることがあります
System.out.println("入力されたデータ: " + input);
}
}
発生条件:空行が意図せず入力され、その後のパース処理でエラー。
解決方法:空の入力を事前に検出します。
import java.util.Scanner;
public class EmptyInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("データを入力してください:");
String input = scanner.nextLine();
if (input.trim().isEmpty()) {
System.out.println("無効な入力です。データを入力してください。");
} else {
System.out.println("入力されたデータ: " + input);
}
}
}
回避のためのベストプラクティス
- 入力を処理する前に
hasNextXxx()
メソッドを使用して型を確認する。 - ロケールに依存しない入力を推奨する。または適切な
Locale
を設定する。 - 例外をキャッチし、適切なエラーメッセージを表示する。
- 空白や不要な文字を事前にトリムする。
- 正規表現やパターンマッチングを使用して入力を検証する。
まとめ
java.util.InputMismatchException
は、Scanner
クラスを使用している際に頻繁に遭遇する例外ですが、事前に入力を検証することで回避できます。ユーザー入力を安全に処理するには、入力データの検証やフォーマットの確認を徹底し、必要に応じて適切なロケールを設定してください。