Kontroller for null, inden du ringer til parse i Double.parseDouble

1. Oversigt

Ved konvertering af en Java Snor til en dobbelt, vi bruger typisk Double.parseDouble (strengværdi) metode. Denne metode giver os mulighed for at konvertere en Snor repræsentation af et givet dobbelt - for eksempel “2.0” - til en primitiv dobbelt værdi.

Som med de fleste metodeopkald er det god praksis at undgå at videregive en nul reference, som sandsynligvis vil resultere i en NullPointerException ved kørselstid.

I denne vejledning undersøger vi flere måder, vi kan kontrollere nul inden påberåbelse Double.parseDouble. Vi starter med at overveje løsninger, der bruger kernen i Java, inden vi ser på nogle eksterne biblioteker.

2. Hvorfor kontrollere

Lad os først forstå hvad sker der, hvis vi ikke ser efter nul værdier, når man analyserer en String. Lad os begynde med at passere en tom Snor:

dobbelt emptyString = Double.parseDouble ("");

Når vi kører denne kode, kaster den en java.lang.NumberFormatException:

Undtagelse i tråd "main" java.lang.NumberFormatException: tom 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) ...

Lad os nu overveje at videregive en nul reference:

dobbelt nullString = Double.parseDouble (null);

Ikke overraskende er en java.lang.NullPointerException vil blive kastet denne gang:

Undtagelse i tråden "main" java.lang.NullPointerException at sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1838) ved sun.misc.FloatingDecimal.parseDouble (FloatingDecimal.java:110) ved java.lang.Double.parseDouble ( Dobbelt.java:538) ...

Som vi ved, kan det være god praksis at bruge undtagelser i vores applikationskode. Men generelt vi bør undgå denne slags ukontrollerede undtagelser, som sandsynligvis er resultatet af en programmeringsfejl.

3. Sådan kontrolleres med Core Java

I dette afsnit vil vi se på flere muligheder for at kontrollere nul eller tomme værdier ved hjælp af core Java.

3.1. Brug af Vanilla Java

Lad os starte med at definere en enkel metode, der kontrollerer, om den værdi, vi videregiver, er nul eller en tom Snor:

privat statisk dobbelt parseStringToDouble (strengværdi) 

Som vi kan se, hvis den værdi, vi prøver at analysere, er nul eller tom denne metode returnerer ikke et tal. Ellers påberåber vi os Double.parseDouble metode.

Vi kan tage dette eksempel et skridt videre og tilbyde muligheden for at levere en foruddefineret standard:

privat statisk dobbelt parseStringToDouble (strengværdi, dobbelt standardværdi) returværdi == null 

Når vi påkalder denne metode, leverer vi en passende standard for at returnere, hvis den leverede værdi er nul eller tom:

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

3.2. Ved brug af Valgfri

Lad os nu se på en anden løsning med brug af Valgfri:

privat statisk Valgfri parseStringToOptionalDouble (strengværdi) værdi.isEmpty ()? Optional.empty (): Optional.of (Double.valueOf (værdi)); 

Denne gang bruger vi Valgfri som returtype. Når vi påberåber os denne metode, har vi derfor muligheden for at kalde standardmetoder som f.eks er til stede() og er tom() for at bestemme, om en værdi er til stede:

parseStringToOptionalDouble ("2"). isPresent ()

Vi kan også returnere en standardværdi ved hjælp af ellers metode til Valgfri:

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

4. Eksterne biblioteker

Nu hvor vi har en god forståelse af, hvordan vi kontrollerer nul og tomme værdier ved hjælp af core Java, lad os se på nogle eksterne biblioteker.

4.1. Google Guava

Den første eksterne løsning, vi vil se på, er Google Guava, som er tilgængelig på Maven Central:

 com.google.guava guava 28.2-jre 

Vi kan simpelthen bruge Double.tryParse metode:

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

I dette eksempel bruger vi også MoreObjects.firstNonNull metode, som returnerer den første af to givne parametre, der ikke er nul.

Denne kode fungerer i de fleste tilfælde fint, men lad os forestille os et andet eksempel:

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

I dette tilfælde, da den tomme Snor ikke er nul, metoden vender tilbage nul i stedet for at smide en NumberFormatException. Vi undgår undtagelsen, men vi bliver stadig nødt til at håndtere en nul værdi på et eller andet tidspunkt i vores applikationskode.

4.2. Apache Commons Lang NumberUtils

Det NumberUtils klasse giver mange nyttige hjælpeprogrammer, der gør det nemmere at arbejde med tal.

Apache Commons Lang-artefakten fås fra Maven Central:

 org.apache.commons commons-lang3 3.9 

Så kan vi simpelthen bruge metoden toDouble fra NumberUtils:

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

Her har vi to muligheder:

  • Konverter en Snor til en dobbelt, vender tilbage 0,0d hvis konverteringen mislykkes
  • Konverter en Snor til en dobbelt, der giver en defineret standardværdi, hvis konverteringen mislykkes

Hvis vi passerer en tom eller nul værdi, 0,0d returneres som standard:

assertThat (NumberUtils.toDouble ("")). er EqualTo (0.0d); assertThat (NumberUtils.toDouble (null)). er EqualTo (0,0d);

Dette er bedre end det foregående eksempel, da vi altid får en dobbelt returværdi uanset hvad der sker under konverteringen.

4.3. Vavr

Sidst, men ikke mindst, lad os se på vavr.io, som tilbyder en funktionel tilgang.

Som altid kan artefakten findes på Maven Central:

 io.vavr vavr 0.10.2 

Igen definerer vi en enkel metode, der gør brug af vavr Prøve klasse:

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

Vi påkalder denne metode på nøjagtig samme måde som i vores andre eksempler:

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

5. Konklusion

I denne hurtige vejledning har vi undersøgt flere måder at kontrollere nul og tomme strenge, inden de påberåber sig Double.parseDouble metode.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.