Grundlegendes zur NumberFormatException in Java

1. Einleitung

Java löst NumberFormatException aus - eine ungeprüfte Ausnahme - wenn es einen String nicht in einen Zahlentyp konvertieren kann .

Da es nicht markiert ist, zwingt uns Java nicht, es zu behandeln oder zu deklarieren.

In diesem kurzen Tutorial beschreiben und demonstrieren wir, was NumberFormatException in Java verursacht und wie man es vermeidet oder damit umgeht .

2. Ursachen der NumberFormatException

Es gibt verschiedene Probleme, die NumberFormatException verursachen . Beispielsweise lösen einige Konstruktoren und Methoden in Java diese Ausnahme aus.

Wir werden die meisten davon in den folgenden Abschnitten besprechen.

2.1. Nicht numerische Daten werden an den Konstruktor übergeben

Schauen wir uns einen Versuch an, ein Integer- oder Double- Objekt mit nicht numerischen Daten zu erstellen.

Beide Anweisungen lösen eine NumberFormatException aus :

Integer aIntegerObj = new Integer("one"); Double doubleDecimalObj = new Double("two.2");

Sehen wir uns den Stack-Trace an, den wir erhalten haben, als wir in Zeile 1 eine ungültige Eingabe "Eins" an den Integer- Konstruktor übergeben haben:

Exception in thread "main" java.lang.NumberFormatException: For input string: "one" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.(Integer.java:867) at MainClass.main(MainClass.java:11)

Es warf NumberFormatException . Der Integer- Konstruktor ist fehlgeschlagen, als versucht wurde, die Eingabe mit parseInt () intern zu verstehen .

Die Java Number API analysiert keine Wörter in Zahlen, daher können wir den Code korrigieren, indem wir ihn einfach auf einen erwarteten Wert ändern:

Integer aIntegerObj = new Integer("1"); Double doubleDecimalObj = new Double("2.2");

2.2. Analysieren von Zeichenfolgen mit nicht numerischen Daten

Ähnlich wie bei Java für das Parsen im Konstruktor gibt es spezielle Analysemethoden wie par seInt (), parseDouble (), valueOf () und decode () .

Wenn wir versuchen, die gleichen Arten der Konvertierung mit diesen durchzuführen:

int aIntPrim = Integer.parseInt("two"); double aDoublePrim = Double.parseDouble("two.two"); Integer aIntObj = Integer.valueOf("three"); Long decodedLong = Long.decode("64403L");

Dann werden wir die gleiche Art von fehlerhaftem Verhalten sehen.

Und wir können sie auf ähnliche Weise beheben:

int aIntPrim = Integer.parseInt("2"); double aDoublePrim = Double.parseDouble("2.2"); Integer aIntObj = Integer.valueOf("3"); Long decodedLong = Long.decode("64403");

2.3. Übergeben von Zeichenfolgen mit fremden Zeichen

Oder wenn wir versuchen, eine Zeichenfolge in eine Zahl mit fremden Eingabedaten wie Leerzeichen oder Sonderzeichen umzuwandeln :

Short shortInt = new Short("2 "); int bIntPrim = Integer.parseInt("_6000");

Dann haben wir das gleiche Problem wie zuvor.

Wir könnten diese mit ein wenig String-Manipulation korrigieren:

Short shortInt = new Short("2 ".trim()); int bIntPrim = Integer.parseInt("_6000".replaceAll("_", "")); int bIntPrim = Integer.parseInt("-6000");

Beachten Sie hier in Zeile 3, dass negative Zahlen zulässig sind , wobei der Bindestrich als Minuszeichen verwendet wird.

2.4. Gebietsschemaspezifische Zahlenformate

Sehen wir uns einen Sonderfall von länderspezifischen Nummern an. In europäischen Regionen kann ein Komma eine Dezimalstelle darstellen. Beispielsweise kann "4000,1" die Dezimalzahl "4000,1" darstellen.

Standardmäßig erhalten wir NumberFormatException, indem wir versuchen, einen Wert zu analysieren, der ein Komma enthält:

double aDoublePrim = Double.parseDouble("4000,1");

Wir müssen Kommas zulassen und in diesem Fall die Ausnahme vermeiden. Um dies zu ermöglichen, muss Java das Komma hier als Dezimalzahl verstehen.

Mit NumberFormat können wir Kommas für die europäische Region zulassen und die Ausnahme vermeiden .

Lassen Sie es uns anhand des Gebietsschemas für Frankreich als Beispiel in Aktion sehen :

NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE); Number parsedNumber = numberFormat.parse("4000,1"); assertEquals(4000.1, parsedNumber.doubleValue()); assertEquals(4000, parsedNumber.intValue()); 

3. Best Practices

Lassen Sie uns über einige bewährte Methoden sprechen, die uns beim Umgang mit NumberFormatException helfen können :

  1. Versuchen Sie nicht, alphabetische Zeichen oder Sonderzeichen in Zahlen umzuwandeln - die Java Number API kann dies nicht.
  2. Möglicherweise möchten wir eine Eingabezeichenfolge mit regulären Ausdrücken überprüfen und die Ausnahme für die ungültigen Zeichen auslösen .
  3. Mit Methoden wie trim () und replaceAll () können wir Eingaben gegen vorhersehbare bekannte Probleme bereinigen .
  4. In einigen Fällen können Sonderzeichen in der Eingabe gültig sein. Deshalb führen wir hierfür eine spezielle Verarbeitung durch, beispielsweise mit NumberFormat , das zahlreiche Formate unterstützt.

4. Fazit

In diesem Tutorial haben wir NumberFormatException in Java und deren Ursachen erläutert . Das Verständnis dieser Ausnahme kann uns helfen, robustere Anwendungen zu erstellen.

Darüber hinaus haben wir Strategien zur Vermeidung der Ausnahme mit einigen ungültigen Eingabezeichenfolgen gelernt.

Schließlich haben wir einige Best Practices für den Umgang mit NumberFormatException gesehen .

Der in den Beispielen verwendete Quellcode befindet sich wie üblich auf GitHub.