Kurs Java Podstawy - rozszerzony

InputMismatchException

InputMismatchException jest wyjątkiem z grupy wyjątków nieobsługiwanych, czyli dziedziczących po klasie RuntimeException. Dzięki temu nie ma konieczności jego jawnej obsługi poprzez przechwycenie w bloku try-catch lub deklarację możliwości jego wystąpienia w nagłówku poprzez instrukcję throws.

Wyjątek InputMismatchException znajduje się w pakiecie java.util więc pełna ścieżka do klasy to java.util.InputMismatchException i należy z niej skorzystać podczas importu.

Najpopularniejsza sytuacja, w której wyjątek ten może zostać wygenerowany jest próba odczytania danych w niepoprawnym formacie np. z wykorzystaniem klasy Scanner. Jeżeli będziemy próbowali odczytać liczbę całkowitą, ale zamiast tego wprowadzimy ciąg znaków, Java wygeneruje wyjątek, ponieważ nie można przekonwertować ciągu typu "abc" na liczbę.

Przykład:

import java.util.Scanner;

public class InputMismatchTest {

    public static void main(String[] args)  {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Podaj liczbę: ");
        int number = scanner.nextInt();
        System.out.println(number);
        scanner.close();
    }

}

Uruchomienie programu i wpisanie np. "abc" spowoduje wygenerowanie w konsoli komunikatu wyjątku:

inputmismatchexception

Mniej oczywisty przypadek to próba wprowadzenia liczby zmiennoprzecinkowej z nieodpowiednim separatorem dziesiętnym. W zależności od tego, czy nasza wirtualna maszyna ma konfigurację europejską (np. PL, EN, DE), czy stanów zjednoczonych (US), to oczekuje, że podamy liczbę albo z kropką (US) albo z przecinkiem (Europa).

import java.util.Scanner;

public class InputMismatchTest {

    public static void main(String[] args)  {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Podaj liczbę zmiennoprzecinkową: ");
        double number = scanner.nextDouble();
        System.out.println(number);
        scanner.close();
    }

}

Przy założeniu, że korzystamy z polskiego systemu operacyjnego i domyślnych ustawień, próba wczytania danych z kropką, np 2.5 wygeneruje wyjątek jak poniżej:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextDouble(Scanner.java:2413)
    at InputMismatchTest.main(InputMismatchTest.java:8)

Wyjątek można obsłużyć w bloku try-catch, np.:

import java.util.InputMismatchException;
import java.util.Scanner;

public class InputMismatchTest {

    public static void main(String[] args)  {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Podaj liczbę zmiennoprzecinkową: ");
        try {
            double number = scanner.nextDouble();
            System.out.println(number);
        } catch (InputMismatchException e) {
            System.out.println("Podałeś liczbę w złym formacie");
        }
        scanner.close();
    }

}

Komentarze