Sjekk om det er null før du ringer til parse i Double.parseDouble

1. Oversikt

Når du konverterer en Java String til en dobbelt, vi bruker vanligvis Double.parseDouble (strengverdi) metode. Denne metoden lar oss konvertere en String representasjon av et gitt dobbelt - for eksempel “2.0” - til en primitiv dobbelt verdi.

Som med de fleste metodeanrop, er det god praksis å unngå å sende en null referanse, som sannsynligvis vil resultere i en NullPointerException ved kjøretid.

I denne opplæringen vil vi utforske flere måter vi kan se etter null før påberope seg Double.parseDouble. Vi begynner med å vurdere løsninger ved hjelp av kjernen Java før vi ser på noen eksterne biblioteker.

2. Hvorfor sjekke

La oss først forstå hva skjer hvis vi ikke ser etter null verdier når du analyserer en String. La oss begynne med å passere en tom String:

double emptyString = Double.parseDouble ("");

Når vi kjører denne koden, vil den kaste a java.lang.NumberFormatException:

Unntak i tråden "hoved" 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) ...

La oss nå vurdere å passere en null henvisning:

dobbel nullString = Double.parseDouble (null);

Ikke overraskende, a java.lang.NullPointerException blir kastet denne gangen:

Unntak i tråden "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) ...

Som vi vet kan det være god praksis å bruke unntak i søknadskoden vår. Men generelt, vi bør unngå slike unchecked unntak, som sannsynligvis er et resultat av en programmeringsfeil.

3. Hvordan sjekke med Core Java

I denne delen vil vi se på flere alternativer å se etter null eller tomme verdier ved hjelp av kjernen Java.

3.1. Bruke Vanilla Java

La oss starte med å definere en enkel metode som vil sjekke om verdien vi overfører er null eller en tom String:

privat statisk dobbel parseStringToDouble (strengverdi) 

Som vi kan se, hvis verdien vi prøver å analysere er null eller tøm denne metoden returnerer ikke et tall. Ellers påkaller vi Double.parseDouble metode.

Vi kan ta dette eksemplet et skritt videre og tilby muligheten til å levere en forhåndsdefinert standard:

privat statisk dobbel parseStringToDouble (strengverdi, dobbel standardverdi) returverdi == null 

Når vi påkaller denne metoden, gir vi en passende standard for å returnere hvis den oppgitte verdien er null eller tom:

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

3.2. Ved hjelp av Valgfri

La oss nå ta en titt på en annen løsning med bruk av Valgfri:

privat statisk Valgfri parseStringToOptionalDouble (strengverdi) verdi.isEmpty ()? Optional.empty (): Optional.of (Double.valueOf (verdi)); 

Denne gangen bruker vi Valgfri som returtype. Derfor, når vi påkaller denne metoden, har vi da muligheten til å kalle standardmetoder som er tilstede() og er tom() for å bestemme om en verdi er til stede:

parseStringToOptionalDouble ("2"). isPresent ()

Vi kan også returnere en standardverdi ved hjelp av ellers Metode av Valgfri:

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

4. Eksterne biblioteker

Nå som vi har en god forståelse av hvordan vi kan sjekke om null og tomme verdier ved hjelp av kjernen Java, la oss ta en titt på noen eksterne biblioteker.

4.1. Google Guava

Den første eksterne løsningen vi ser på er Google Guava, som er tilgjengelig på Maven Central:

 com.google.guava guava 28.2-jre 

Vi kan ganske enkelt bruke Dobbelt. PrøveParse metode:

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

I dette eksemplet bruker vi også MoreObjects.firstNonNull metode, som vil returnere den første av to gitte parametere som ikke er null.

Denne koden vil fungere bra i de fleste tilfeller, men la oss forestille oss et annet eksempel:

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

I dette tilfellet, siden den tomme String ikke er det null, vil metoden komme tilbake null i stedet for å kaste a NumberFormatException. Vi unngår unntaket, men vi må fortsatt håndtere a null verdi på et tidspunkt i søknadskoden vår.

4.2. Apache Commons Lang NumberUtils

De NumberUtils klasse gir mange nyttige verktøy som gjør det lettere å jobbe med tall.

Apache Commons Lang-gjenstanden er tilgjengelig fra Maven Central:

 org.apache.commons commons-lang3 3.9 

Da kan vi ganske enkelt bruke metoden toDouble fra NumberUtils:

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

Her har vi to alternativer:

  • Konverter a String til en dobbelt, kommer tilbake 0,0d hvis konverteringen mislykkes
  • Konverter a String til en dobbelt, gir en definert standardverdi hvis konverteringen mislykkes

Hvis vi passerer en tom eller null verdi, 0,0d returneres som standard:

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

Dette er bedre enn forrige eksempel, da vi alltid får en dobbelt returverdi uansett hva som skjer under konverteringen.

4.3. Vavr

Sist, men ikke minst, la oss ta en titt på vavr.io, som tilbyr en funksjonell tilnærming.

Som alltid kan gjenstanden finnes på Maven Central:

 io.vavr vavr 0.10.2 

Igjen vil vi definere en enkel metode som bruker vavr Prøve klasse:

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

Vi vil påkalle denne metoden på nøyaktig samme måte som i våre andre eksempler:

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

5. Konklusjon

I denne raske opplæringen har vi utforsket flere måter å se etter null og tøm strengene før du påberoper deg Double.parseDouble metode.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.