InputMismatchException
Opis
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:
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)
Obsługa
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();
}
}
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.