Predtým, ako zavoláte parse, skontrolujte, či nemá hodnotu null v Double.parseDouble

1. Prehľad

Pri konverzii Java String do a dvojitý, typicky použijeme Double.parseDouble (hodnota reťazca) metóda. Táto metóda nám umožňuje previesť a String reprezentácia daného dvojitý - napríklad „2.0“ - primitívovi dvojitý hodnotu.

Rovnako ako pri väčšine volaní metód, je dobrým zvykom vyhnúť sa absolvovaniu a nulový referencia, ktorej výsledkom bude pravdepodobne a NullPointerException za behu.

V tomto tutoriáli preskúmame niekoľko spôsobov, ako môžeme skontrolovať nulový pred vyvolaním Double.parseDouble. Začneme zvážením riešení využívajúcich jadro Java predtým, ako sa pozrieme na niektoré externé knižnice.

2. Prečo skontrolovať

Najprv to pochopme čo sa stane, ak nekontrolujeme nulový hodnoty pri analýze S.tring. Začnime prechodom prázdneho miesta String:

double emptyString = Double.parseDouble ("");

Keď spustíme tento kód, vyhodí a java.lang.NumberFormatException:

Výnimka vo vlákne „main“ java.lang.NumberFormatException: prázdny reťazec na sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1842) na sun.misc.FloatingDecimal.parseDouble (FloatingDecimal.java:110) na java.lang.Double .parseDouble (Double.java:538) ...

Teraz zvážime absolvovanie a nulový referencia:

double nullString = Double.parseDouble (null);

Nie je prekvapením, že a java.lang.NullPointerException bude vyhodené tentokrát:

Výnimka vo vlákne „main“ java.lang.NullPointerException na serveri sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1838) na serveri sun.misc.FloatingDecimal.parseDouble (FloatingDecimal.java:110) na serveri java.lang.Double.parseDouble.parseDouble Double.java:538) ...

Ako vieme, môže byť dobrým zvykom používať v našom kóde aplikácie výnimky. Ale všeobecne, mali by sme sa vyhnúť týmto druhom nekontrolovaných výnimiek, ktoré sú pravdepodobne výsledkom programovacej chyby.

3. Ako skontrolovať s Core Java

V tejto časti sa pozrieme na niekoľko možností, ktoré treba skontrolovať nulový alebo prázdne hodnoty pomocou jadra Java.

3.1. Používanie jazyka Vanilla Java

Začnime definovaním jednoduchej metódy, ktorá skontroluje, či hodnota, ktorú odovzdáme, je nulový alebo prázdny String:

private static double parseStringToDouble (hodnota reťazca) 

Ako vidíme, hodnota, ktorú sa snažíme analyzovať, je nulový alebo vyprázdnenie tejto metódy nevráti číslo. V opačnom prípade sa dovoláme Double.parseDouble metóda.

Tento príklad môžeme posunúť o krok ďalej a ponúknuť možnosť dodania preddefinovaného predvoleného nastavenia:

private static double parseStringToDouble (hodnota reťazca, dvojnásobok defaultValue) návratová hodnota == null 

Keď vyvoláme túto metódu, poskytneme príslušné predvolené nastavenie na vrátenie, ak je zadaná hodnota nulový alebo prázdne:

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. Použitím Voliteľné

Poďme sa teraz spolu pozrieť na iné riešenie použitie Voliteľné:

private static Voliteľné parseStringToOptionalDouble (hodnota reťazca) value.isEmpty ()? Optional.empty (): Optional.of (Double.valueOf (hodnota)); 

Tentokrát používame Voliteľné ako návratový typ. Keď teda vyvoláme túto metódu, máme potom možnosť zavolať štandardné metódy ako napr je prítomný() a je prázdny() na určenie, či je hodnota prítomná:

parseStringToOptionalDouble ("2"). isPresent ()

Predvolenú hodnotu môžeme vrátiť aj pomocou znaku alebo iný metóda Voliteľné:

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

4. Externé knižnice

Teraz, keď dobre rozumieme tomu, ako skontrolovať nulový a prázdne hodnoty pomocou jadra Java, pozrime sa na niektoré externé knižnice.

4.1. Google Guava

Prvým externým riešením, na ktoré sa pozrieme, je Google Guava, ktorý je k dispozícii na serveri Maven Central:

 com.google.guava guava 28.2-jre 

Môžeme jednoducho použiť Štvorhra. Vyskúšať metóda:

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

V tomto príklade používame tiež znak MoreObjects.firstNonNull metóda, ktorá vráti prvý z dvoch daných parametrov, ktorý nie je nulový.

Tento kód bude vo väčšine prípadov fungovať dobre, ale poďme si predstaviť iný príklad:

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

V tomto prípade od prázdneho String nie je nulový, metóda sa vráti nulový namiesto hodu a NumberFormatException. Vyhýbame sa výnimke, ale aj tak budeme musieť zvládnuť a nulový niekedy v našom kóde aplikácie.

4.2. Apache Commons Lang NumberUtils

The NumberUtils trieda poskytuje mnoho užitočných obslužných programov, ktoré uľahčujú prácu s číslami.

Artefakt Apache Commons Lang je k dispozícii na serveri Maven Central:

 org.apache.commons commons-lang3 3.9 

Potom môžeme metódu jednoducho použiť zdvojnásobiť od NumberUtils:

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

Tu máme dve možnosti:

  • Premeniť a String do a dvojitý, vracajúci sa 0,0 d ak prevod zlyhá
  • Premeniť a String do a dvojitý, poskytujúca definovanú predvolenú hodnotu, ak sa prevod nepodarí

Ak minieme prázdny resp nulový hodnota, 0,0 d je vrátený v predvolenom nastavení:

assertThat (NumberUtils.toDouble ("")). isEqualTo (0,0d); assertThat (NumberUtils.toDouble (null)). isEqualTo (0,0d);

Je to lepšie ako v predchádzajúcom príklade, pretože vždy dostaneme a dvojitý návratová hodnota bez ohľadu na to, čo sa stane počas prevodu.

4.3. Vavr

V neposlednom rade sa pozrime vavr.io, ktorá ponúka funkčný prístup.

Ako vždy, artefakt nájdete na Maven Central:

 io.vavr vavr 0.10.2 

Opäť definujeme jednoduchú metódu, ktorá využíva vavr Vyskúšajte trieda:

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

Túto metódu vyvoláme úplne rovnako ako v našich ďalších príkladoch:

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

5. Záver

V tomto rýchlom výučbe sme preskúmali niekoľko spôsobov kontroly nulový a prázdne reťazce pred vyvolaním súboru Double.parseDouble metóda.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found