InputMismatchException

Spis treści

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:

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).

Kurs Java

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.