Provjerite je li null prije pozivanja Parse u Double.parseDouble

1. Pregled

Pri pretvaranju Jave Niz do a dvostruko, obično ćemo koristiti Double.parseDouble (vrijednost niza) metoda. Ova metoda omogućuje nam pretvaranje a Niz predstavljanje datog dvostruko - na primjer, "2.0" - na primitiv dvostruko vrijednost.

Kao i kod većine poziva metoda, dobra je praksa izbjegavati polaganje null referenca, što će vjerojatno rezultirati a NullPointerException za vrijeme izvođenja.

U ovom uputstvu istražit ćemo nekoliko načina na koje možemo provjeriti null prije pozivanja Double.parseDouble. Za početak ćemo razmotriti rješenja koja koriste jezgru Java prije nego što pogledamo neke vanjske knjižnice.

2. Zašto provjeriti

Prvo, shvatimo što će se dogoditi ako ne provjerimo null vrijednosti pri raščlanjivanju String. Počnimo s dodavanjem praznine Niz:

dvostruko emptyString = Double.parseDouble ("");

Kada pokrenemo ovaj kôd, bacit će a java.lang.NumberFormatException:

Iznimka u niti "main" java.lang.NumberFormatException: prazan niz na sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1842) na sun.misc.FloatingDecimal.parseDouble (FloatingDecimal.parseDouble (FloatingDecimal.java :10 )D na java.lang. .parseDouble (Double.java:538) ...

Sada razmotrimo dodavanje a null referenca:

double nullString = Double.parseDouble (null);

Nije iznenađujuće, a java.lang.NullPointerException bit će bačen ovaj put:

Iznimka u niti "main" java.lang.NullPointerException na sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1838) at sun.misc.FloatingDecimal.parseDouble (FloatingDecimal.java:110) na java.lang.Double (Double). Double.java:538) ...

Kao što znamo, može biti dobra praksa koristiti iznimke u našem kodu aplikacije. Ali općenito, trebali bismo izbjegavati ove vrste neprovjerenih iznimaka, koji su vjerojatno rezultat programske pogreške.

3. Kako provjeriti s jezgrom Java

U ovom ćemo odjeljku pogledati nekoliko mogućnosti za provjeru null ili prazne vrijednosti pomoću jezgre Java.

3.1. Korištenje vanilije Java

Počnimo s definiranjem jednostavne metode koja će provjeriti je li vrijednost koju prolazimo null ili prazna Niz:

privatni statički dvostruki parseStringToDouble (vrijednost niza) 

Kao što vidimo, ako je vrijednost koju pokušavamo raščlaniti null ili prazan ova metoda ne vraća broj. U suprotnom, pozivamo se na Double.parseDouble metoda.

Ovaj primjer možemo napraviti korak dalje i ponuditi mogućnost isporuke unaprijed definiranog zadanog:

privatna statička dvostruka parseStringToDouble (vrijednost niza, dvostruka zadana vrijednost) povratna vrijednost == null 

Kada se pozivamo na ovu metodu, isporučujemo odgovarajuću zadanu vrijednost za povratak ako je navedena vrijednost null ili prazno:

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. Koristeći Neobvezno

Pogledajmo sada drugo rješenje s uporaba Neobvezno:

private static Neobavezno parseStringToOptionalDouble (vrijednost niza) value.isEmpty ()? Optional.empty (): Neobvezno.of (Double.valueOf (value)); 

Ovaj put koristimo Neobvezno kao povratni tip. Stoga, kada se pozivamo na ovu metodu, tada imamo mogućnost pozvati standardne metode poput je prisutan() i prazno je() kako bi se utvrdilo je li vrijednost prisutna:

parseStringToOptionalDouble ("2"). isPresent ()

Također možemo vratiti zadanu vrijednost pomoću ili drugo metoda Neobvezno:

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

4. Vanjske knjižnice

Sad kad dobro razumijemo kako to provjeriti null i prazne vrijednosti pomoću jezgre Java, pogledajmo neke vanjske knjižnice.

4.1. Google Guava

Prvo vanjsko rješenje koje ćemo pogledati je Google Guava, koje je dostupno na Maven Central:

 com.google.guava guava 28,2-jre 

Jednostavno možemo koristiti Parovi.pokušajParse metoda:

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

U ovom primjeru koristimo i MoreObjects.firstNonNull metoda, koja će vratiti prvi od dva zadana parametra koji nije null.

Ovaj će kôd u većini slučajeva dobro funkcionirati, ali zamislimo drugačiji primjer:

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

U ovom slučaju, budući da je prazno Niz nije null, metoda će se vratiti null umjesto da baci a NumberFormatException. Izbjegavamo iznimku, ali svejedno ćemo morati riješiti a null vrijednost u nekom trenutku u našem kodu aplikacije.

4.2. Apache Commons Lang NumberUtils

The NumberUtils klasa nudi mnoge korisne uslužne programe koji olakšavaju rad s brojevima.

Artefakt Apache Commons Lang dostupan je kod Maven Central:

 org.apache.commons commons-lang3 3.9 

Tada možemo jednostavno koristiti metodu doDvostruko iz NumberUtils:

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

Ovdje imamo dvije mogućnosti:

  • Pretvori a Niz do a dvostruko, vraćajući se 0,0 d ako pretvorba ne uspije
  • Pretvori a Niz do a dvostruko, pružajući definiranu zadanu vrijednost ako pretvorba ne uspije

Ako prođemo praznu ili null vrijednost, 0,0 d vraća se prema zadanim postavkama:

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

Ovo je bolje od prethodnog primjera, jer uvijek dobivamo a dvostruko povratna vrijednost bez obzira što se dogodilo tijekom pretvorbe.

4.3. Vavr

Posljednje, ali ne najmanje važno, pogledajmo vavr.io, koji nudi funkcionalan pristup.

Kao i uvijek, artefakt se može naći na Maven Central:

 io.vavr vavr 0.10.2 

Opet ćemo definirati jednostavnu metodu koja koristi vavr Probati razred:

javna statička dvostruka tryStringToDouble (vrijednost niza, dvostruka zadana vrijednost) {return Try.of (() -> Double.parseDouble (vrijednost)). getOrElse (defaultValue); } 

Pozvat ćemo se na ovu metodu na potpuno isti način kao u našim ostalim primjerima:

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

5. Zaključak

U ovom smo brzom vodiču istražili nekoliko načina provjere null i prazne nizove prije poziva na Double.parseDouble metoda.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.