Überprüfen Sie, ob null ist, bevor Sie Parse in Double.parseDouble aufrufen

1. Übersicht

Wenn ein Java - Konvertierung String zu einem Doppel , wir werden in der Regel die Verwendung Double.parseDouble (String value) Methode. Mit dieser Methode können wir eine String- Darstellung eines bestimmten Doppelwerts - beispielsweise „2.0“ - in einen primitiven Doppelwert konvertieren .

Wie bei den meisten Methodenaufrufen, ist es empfehlenswert , eine zu vermeiden vorbei null Referenz, die in einem wahrscheinlich dazu führen werden Nullpointer zur Laufzeit.

In diesem Tutorial werden verschiedene Möglichkeiten untersucht, wie wir vor dem Aufrufen von Double.parseDouble auf Null prüfen können . Wir werden zunächst Lösungen mit Kern-Java in Betracht ziehen, bevor wir uns einige externe Bibliotheken ansehen.

2. Warum überprüfen

Lassen Sie uns zunächst verstehen, was passiert, wenn beim Parsen eines S trings nicht nach Nullwerten gesucht wird . Beginnen wir mit der Übergabe eines leeren Strings :

double emptyString = Double.parseDouble("");

Wenn wir diesen Code ausführen, wird eine java.lang.NumberFormatException ausgelöst :

Exception in thread "main" java.lang.NumberFormatException: empty String at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842) at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.lang.Double.parseDouble(Double.java:538) ...

Betrachten wir nun die Übergabe einer Nullreferenz :

double nullString = Double.parseDouble(null);

Es überrascht nicht, dass diesmal eine java.lang.NullPointerException ausgelöst wird:

Exception in thread "main" java.lang.NullPointerException at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838) at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.lang.Double.parseDouble(Double.java:538) ...

Wie wir wissen, kann es empfehlenswert sein, Ausnahmen in unserem Anwendungscode zu verwenden. Im Allgemeinen sollten wir diese Art von ungeprüften Ausnahmen vermeiden, die wahrscheinlich auf einen Programmierfehler zurückzuführen sind .

3. So überprüfen Sie mit Core Java

In diesem Abschnitt werden verschiedene Optionen vorgestellt, mit denen Sie mithilfe von Kern-Java nach Null- oder Leerwerten suchen können .

3.1. Verwenden von Vanilla Java

Beginnen wir mit der Definition einer einfachen Methode, mit der überprüft wird, ob der von uns übergebene Wert null oder ein leerer String ist :

private static double parseStringToDouble(String value) 

Wie wir sehen können, gibt diese Methode keine Zahl zurück , wenn der Wert, den wir analysieren möchten, null oder leer ist. Andernfalls rufen wir die Double.parseDouble- Methode auf.

Wir können dieses Beispiel noch einen Schritt weiter gehen und die Möglichkeit bieten, einen vordefinierten Standardwert anzugeben :

private static double parseStringToDouble(String value, double defaultValue)  return value == null 

Wenn wir diese Methode aufrufen, geben wir einen geeigneten Standardwert für die Rückgabe an, wenn der angegebene Wert null oder leer ist:

assertThat(parseStringToDouble("1", 2.0d)).isEqualTo(1.0d); assertThat(parseStringToDouble(null, 1.0d)).isEqualTo(1.0d); assertThat(parseStringToDouble("", 1.0d)).isEqualTo(1.0d);

3.2. Mit Optional

Schauen wir uns nun eine andere Lösung mit der Verwendung von Optional an :

private static Optional parseStringToOptionalDouble(String value)  value.isEmpty() ? Optional.empty() : Optional.of(Double.valueOf(value)); 

Dieses Mal verwenden wir Optional als Rückgabetyp. Wenn wir diese Methode aufrufen, haben wir daher die Möglichkeit, Standardmethoden wie isPresent () und isEmpty () aufzurufen, um festzustellen, ob ein Wert vorhanden ist:

parseStringToOptionalDouble("2").isPresent()

Wir können auch einen Standardwert mit der orElse- Methode von Optional zurückgeben :

parseStringToOptionalDouble("1.0").orElse(2.0d) parseStringToOptionalDouble(null).orElse(2.0d) parseStringToOptionalDouble("").orElse(2.0d)

4. Externe Bibliotheken

Nachdem wir nun ein gutes Verständnis dafür haben, wie mit Java-Kernwerten nach Null- und Leerwerten gesucht wird, werfen wir einen Blick auf einige externe Bibliotheken.

4.1. Google Guava

Die erste externe Lösung, die wir uns ansehen werden, ist Google Guava, das auf Maven Central verfügbar ist:

 com.google.guava guava 28.2-jre 

Wir können einfach die Doubles.tryParse- Methode verwenden:

Doubles.tryParse(MoreObjects.firstNonNull("1.0", "2.0")) Doubles.tryParse(MoreObjects.firstNonNull(null, "2.0"))

In diesem Beispiel verwenden wir auch die MoreObjects.firstNonNull- Methode, die den ersten von zwei angegebenen Parametern zurückgibt , der nicht null ist .

Dieser Code funktioniert in den meisten Fällen einwandfrei, aber stellen wir uns ein anderes Beispiel vor:

Doubles.tryParse(MoreObjects.firstNonNull("", "2.0"))

In diesem Fall, da der leere String nicht ist null , wird die Methode zurückgeben null stattdessen einen werfen Number . Wir vermeiden die Ausnahme, müssen aber irgendwann in unserem Anwendungscode noch einen Nullwert verarbeiten .

4.2. Apache Commons Lang NumberUtils

Die NumberUtils- Klasse bietet viele nützliche Dienstprogramme, die das Arbeiten mit Zahlen erleichtern.

Das Apache Commons Lang-Artefakt ist bei Maven Central erhältlich:

 org.apache.commons commons-lang3 3.9 

Dann können wir einfach die Methode verwenden, um von NumberUtils zu verdoppeln :

NumberUtils.toDouble("1.0") NumberUtils.toDouble("1.0", 1.0d) 

Hier haben wir zwei Möglichkeiten:

  • Convert a String to a double, returning 0.0d if the conversion fails
  • Convert a String to a double, providing a defined default value if the conversion fails

If we pass an empty or null value, 0.0d is returned by default:

assertThat(NumberUtils.toDouble("")).isEqualTo(0.0d); assertThat(NumberUtils.toDouble(null)).isEqualTo(0.0d);

This is better than the previous example, as we always get a double return value no matter what happens during the conversion.

4.3. Vavr

Last, but not least, let's take a look at vavr.io, which offers a functional approach.

As always, the artifact can be found on Maven Central:

 io.vavr vavr 0.10.2 

Again, we'll define a simple method that makes use of the vavr Try class:

public static double tryStringToDouble(String value, double defaultValue) { return Try.of(() -> Double.parseDouble(value)).getOrElse(defaultValue); } 

Wir werden diese Methode genauso aufrufen wie in unseren anderen Beispielen:

assertThat(tryStringToDouble("1", 2.0d)).isEqualTo(1.0d); assertThat(tryStringToDouble(null, 2.0d)).isEqualTo(2.0d); assertThat(tryStringToDouble("", 2.0d)).isEqualTo(2.0d);

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir verschiedene Möglichkeiten untersucht, nach null und leeren Zeichenfolgen zu suchen, bevor wir die Double.parseDouble- Methode aufrufen .

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.