NumberFormatException în Java

Apare când un text nu poate fi transformat în număr: Integer.parseInt("12a"), "3,14" cu virgulă, text gol.

Sintaxă
public class NumberFormatException extends IllegalArgumentException

Integer.parseInt("12a")      // aruncă NumberFormatException
Double.parseDouble("3,14")   // aruncă NumberFormatException

Ce face NumberFormatException

Integer.parseInt, Long.parseLong, Double.parseDouble, new BigDecimal(text) și metodele valueOf aruncă NumberFormatException dacă textul nu este un număr valid. Mesajul arată textul primit: For input string: "12a".

Cauze frecvente: spații la început sau sfârșit (" 42"), virgula zecimală românească ("3,14"; Java așteaptă punct), text gol, numere prea mari pentru tip ("3000000000" la int).

Este o subclasă a IllegalArgumentException, deci neverificată. Pentru date introduse de utilizator, prinde-o și afișează un mesaj prietenos.

Ce returnează

Excepția este aruncată de metoda de conversie.

Exemple

Exemplul 1: Texte care nu sunt numere

public class Main {
    public static void main(String[] args) {
        String[] intrari = {"42", " 42", "12a", "3,14", "", "3000000000"};
        for (String s : intrari) {
            try {
                System.out.println("\"" + s + "\" -> " + Integer.parseInt(s));
            } catch (NumberFormatException e) {
                System.out.println("\"" + s + "\" -> eroare: " + e.getMessage());
            }
        }
    }
}

Rezultat

"42" -> 42
" 42" -> eroare: For input string: " 42"
"12a" -> eroare: For input string: "12a"
"3,14" -> eroare: For input string: "3,14"
"" -> eroare: For input string: ""
"3000000000" -> eroare: For input string: "3000000000"

Exemplul 2: Citire prietenoasă de la tastatură

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String linie = in.nextLine().strip();
            try {
                double pret = Double.parseDouble(linie.replace(',', '.'));
                System.out.println("Preț acceptat: " + pret + " lei");
                break;
            } catch (NumberFormatException e) {
                System.out.println("\"" + linie + "\" nu este un preț. Încearcă din nou.");
            }
        }
    }
}

Ce scrie utilizatorul (intrare)

doisprezece
12,50

Rezultat

"doisprezece" nu este un preț. Încearcă din nou.
Preț acceptat: 12.5 lei

Greșeli frecvente

  • Nu apelezi strip() înainte de parseInt. Un spațiu sau un \n la final aruncă excepția.
  • Te aștepți ca Double.parseDouble("3,14") să meargă. Java folosește punctul; înlocuiește virgula sau folosește NumberFormat cu Locale românesc.

Comenzi înrudite

  • IllegalArgumentException: Excepția aruncată când o metodă primește un argument cu valoare nepermisă (vârstă negativă, lună 13).
  • Integer.parseInt: Transformă un text ca „42” în numărul întreg 42; valueOf face același lucru, dar returnează un obiect Integer.
  • Exception: Clasa de bază pentru erorile pe care un program le poate trata; getMessage() returnează mesajul dat la creare.