【Java】InputMismatchExceptionについて

【Java】InputMismatchExceptionについて

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クラスを使用している際に頻繁に遭遇する例外ですが、事前に入力を検証することで回避できます。ユーザー入力を安全に処理するには、入力データの検証やフォーマットの確認を徹底し、必要に応じて適切なロケールを設定してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です