String in int umwandeln in Java
Java-String in int umwandeln mit Integer.parseInt und Integer.valueOf, und NumberFormatException behandeln.
Text wie "42" in die Zahl 42 umzuwandeln, gehört zu den häufigsten Aufgaben in Java — sie begegnet einem immer wieder beim Lesen von Kommandozeilenargumenten, beim Verarbeiten von Konfigurationswerten oder bei der Verarbeitung von Formulareingaben. Das JDK bietet dafür einige einzeilige Werkzeuge in der Klasse Integer, sowie ein klares Fehlverhalten, wenn der Text keine gültige Zahl ist. Dieses Kapitel zeigt die idiomatischen Ansätze und den Umgang mit ungültigen Eingaben.
Integer.parseInt — das primitive int, das man meistens braucht
Integer.parseInt(String) ist das Arbeitstier. Es liest den Text und gibt ein primitives int zurück:
int count = Integer.parseInt("42"); // 42
int neg = Integer.parseInt("-7"); // -7Ein führendes + oder - ist erlaubt, aber nichts anderes: umgebende Leerzeichen, Dezimalpunkte, Unterstriche oder Buchstaben führen alle zu einem Fehler. Falls Leerzeichen vorhanden sein könnten, sollte man sie vorher mit s.trim() (oder s.strip() ab Java 11+) entfernen. Es gibt auch eine Überladung, die einen Radix entgegennimmt, sodass Integer.parseInt("ff", 16) hexadezimal liest und 255 zurückgibt.
Integer.valueOf — wenn man ein Integer-Objekt benötigt
Integer.valueOf(String) führt dieselbe Analyse durch, gibt aber ein Integer (den umhüllten Wrapper) statt eines primitiven int zurück. Man greift darauf zurück, wenn der Wert direkt in eine Collection wie List<Integer> oder an eine Stelle kommt, die eine Objektreferenz erfordert. Als Bonus cacht valueOf die umhüllten Instanzen für kleine Werte (−128 bis 127), sodass es geringfügig günstiger sein kann als parseInt gefolgt von Autoboxing.
| Ansatz | Rückgabewert | Verwenden wenn |
|---|---|---|
Integer.parseInt(s) | primitives int | man sofort Arithmetik durchführen möchte |
Integer.valueOf(s) | Integer-Objekt | man einen Wrapper für eine Collection oder Generics benötigt |
Integer.parseInt(s, radix) | primitives int | der Text in Basis 2, 8, 16 usw. vorliegt |
Ungültige Eingaben mit NumberFormatException behandeln
Beide Methoden werfen eine unchecked NumberFormatException, wenn der String kein parsbarer Integer ist — "12x", "3.14", "" oder null schlagen alle fehl. Da sie unchecked ist, zwingt der Compiler nicht dazu, sie abzufangen, sodass es selbst in der Verantwortung liegt, Eingaben, die man nicht kontrolliert, abzusichern:
String raw = userInput();
try {
int value = Integer.parseInt(raw.trim());
// ... use value
} catch (NumberFormatException e) {
System.out.println("Not a whole number: " + raw);
}Wenn das Parsen "manchmal scheitern soll" und man keine Ausnahmen im Kontrollfluss möchte, kann man es in einen Helfer einwickeln, der statt einer Exception ein OptionalInt zurückgibt. Das verwandelt ein try/catch in eine saubere isPresent()-Prüfung an der Aufrufstelle. Siehe Java Optional für das allgemeinere Muster und Java try-catch für die Mechanik des Abfangens der Exception.
Ein ausgearbeitetes Beispiel: alle Ansätze nebeneinander
Dieses Programm führt jede Konversionstechnik und die beiden Fehlerfälle aus, sodass man genau sehen kann, was jeder zurückgibt oder ausgibt:
Was man aus dem Lauf mitnehmen sollte:
Integer.parseInt("42")gibt42als primitivesintaus, undInteger.valueOf("42")gibt dasselbe42aus — der Unterschied liegt im Typ, einem Objekt gegenüber einem Primitiv, nicht im Wert.- Die Radix-Überladung wandelt
"ff"in255um und beweist, dass das zweite Argument die Basis steuert; ohne Radix ist der Standardwert 10. "12x"wird mitNumberFormatExceptionabgelehnt, deren MeldungFor input string: "12x"lautet — die Exception benennt genau den Text, der fehlgeschlagen ist, was sie in Logs nützlich macht.- Die Übergabe von
nullwirftNumberFormatException(MeldungCannot parse null string), nichtNullPointerException— daher deckt ein einzelnes Catch fürNumberFormatExceptionsowohl fehlerhafte als auch null-Eingaben ab. - Der
tryParse-Helfer kürzt" 7 "auf7und gibtabsentfür"nope"zurück, ohne jemals zu werfen — das ist das Muster, das man verwenden sollte, wenn ungültige Eingaben normal und nicht außergewöhnlich sind.
Übungen
Verwandte Themen
- int in einen String umwandeln in Java — die umgekehrte Richtung.
- Java Exceptions — Hintergrundinformationen zu
NumberFormatExceptionund der Familie der unchecked Exceptions. - Java-Datentypen — der Unterschied zwischen dem primitiven
intund demInteger-Wrapper.