Kurs Java Podstawy - rozszerzony

NumberFormatException

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.

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)

number format exception result

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();
	}
}

inputmismatch

Przykłady na Github

Komentarze