NumberFormatException
Opis
NumberFormatException jest wyjątkiem z grupy wyjątków niekontrolowanych (dziedziczących po RuntimeException ), więc nie ma konieczności jego obsługi. Możemy się z nim spotkać w sytuacji, gdy próbujemy wczytać liczbę z konsoli, pliku lub innego źródła, albo przekonwertować liczbę ze Stringa, który liczby tak naprawdę nie reprezentuje.
Wyjątek znajduje się w pakiecie java.lang i dzięki temu nie ma konieczności dodawania dodatkowych importów, pełna ścieżka do klasy to java.lang.NumberFormatException.
Przykład
package pl.javastart.exception;
import java.util.Scanner;
public class NumberExceptionExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Give me some numer:");
String text = sc.nextLine();
int number = Integer.parseInt(text);
System.out.println("Your number is: " + number);
sc.close();
}
}
Powyższy przykład obrazuje scenariusz wczytania od użytkownika dowolnego tekstu przy pomocy Scannera . Następnie korzystając z metody Integer.parseInt() próbujemy przekształcić ten napis na liczbę, O ile jest to faktycznie liczba całkowita, wszystko będzie ok, jednak jeśli użytkownik poda np. kilka liter otrzymamy w konsoli komunikat typu:
Exception in thread "main" java.lang.NumberFormatException: For input string: "asd"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at pl.javastart.exception.NumberExceptionExample.main(NumberExceptionExample.java:10)
Najlepszym sposobem na pozbycie się tego problemu jest obsługa wyjątku w bloku try catch:
package pl.javastart.exception.numberformatexception;
import java.util.Scanner;
public class NumberFormatExceptionSolvedExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Give me some numer:");
String text = sc.nextLine();
try {
int number = Integer.parseInt(text);
System.out.println("Your number is: " + number);
} catch(NumberFormatException e) {
System.err.println("This is not a number!");
}
sc.close();
}
}
Inny podobny przykład dotyczy sytuacji, gdy wykorzystujemy metody Scannera dedykowane do wczytywania liczb, np. nextInt() . Wtedy wyjątek zostaje przechwycony i zamiast niego rzucany jest InputMismatchExcetpion.
package pl.javastart.exception.numberformatexception;
import java.util.Scanner;
public class NumberFormatExceptionExample2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Give me some number");
int number = sc.nextInt();
System.out.println("Your number is: " + number);
sc.close();
}
}
Przykłady na Github
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.