Pochopenie NumberFormatException v Jave

1. Úvod

Java hodí NumberFormatException - nekontrolovaná výnimka - keď nemôže konvertovať String na typ čísla.

Pretože to nie je začiarknuté, Java nás nenúti s tým zaobchádzať alebo to deklarovať.

V tomto rýchlom návode si popíšeme a ukážeme čo spôsobuje NumberFormatException v Jave a ako sa tomu vyhnúť alebo ako sa s ním vyrovnať.

2. Príčiny NumberFormatException

Príčinou sú rôzne problémy NumberFormatException. Napríklad niektorí konštruktéri a metódy v Jave zavrhujú túto výnimku.

Väčšine z nich sa budeme venovať v nasledujúcich častiach.

2.1. Konštruktérovi sa odovzdávajú nečíselné údaje

Pozrime sa na pokus o zostrojenie Celé číslo alebo Dvojitý objekt s nečíselnými údajmi.

Obe tieto vyhlásenia budú hodiť NumberFormatException:

Celé číslo aIntegerObj = nové celé číslo ("jedno"); Double doubleDecimalObj = nový Double ("two.2");

Pozrime sa na stopu zásobníka, ktorú sme dostali, keď sme odovzdali neplatný vstup „jeden“ do Celé číslo konštruktor v rade 1:

Výnimka vo vlákne „main“ java.lang.NumberFormatException: Pre vstupný reťazec: „one“ na java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) na java.lang.Integer.parseInt (Integer.java:580) o java.lang.Integer. (Integer.java:867) na MainClass.main (MainClass.java:11)

Hodilo sa to NumberFormatException. The Celé číslo konštruktor zlyhal pri pokuse o porozumenie vstupu pomocou parseInt () vnútorne.

Rozhranie Java Number API nerozkladá slová na čísla, takže môžeme kód opraviť jednoduchou zmenou na očakávanú hodnotu:

Celé číslo aIntegerObj = nové celé číslo ("1"); Double doubleDecimalObj = nový Double ("2.2");

2.2. Analýza reťazcov obsahujúcich nečíselné údaje

Podobne ako podpora Java pri analýze v konštruktore, aj tu máme vyhradené metódy analýzy ako odsseInt (), parseDouble (), hodnota()a dekódovať ().

Ak sa pokúsime urobiť rovnaký druh konverzie pomocou týchto nástrojov:

int aIntPrim = Integer.parseInt ("dva"); double aDoublePrim = Double.parseDouble ("two.two"); Celé číslo aIntObj = Integer.valueOf ("tri"); Long decodedLong = Long.decode ("64403L");

Potom uvidíme rovnaký druh chybného správania.

A môžeme ich opraviť podobnými spôsobmi:

int aIntPrim = Integer.parseInt ("2"); double aDoublePrim = Double.parseDouble ("2.2"); Celé číslo aIntObj = Integer.valueOf ("3"); Long decodedLong = Long.decode ("64403");

2.3. Predávanie reťazcov s cudzími znakmi

Alebo ak sa pokúsime previesť reťazec na číslo pomocou cudzie údaje na vstupe, ako napríklad medzery alebo špeciálne znaky:

Short shortInt = nový Short ("2"); int bIntPrim = Integer.parseInt ("_ 6000");

Potom budeme mať rovnaký problém ako predtým.

Mohli by sme ich opraviť trochou manipulácie s reťazcami:

Short shortInt = nový Short ("2" .trim ()); int bIntPrim = Integer.parseInt ("_ 6000" .replaceAll ("_", "")); int bIntPrim = Integer.parseInt ("- 6000");

Všimnite si to tu v riadku 3 záporné čísla sú povolené, pomocou znaku pomlčky ako znamienka mínus.

2.4. Formáty čísla špecifické pre miestne nastavenie

Pozrime sa na špeciálny prípad čísel špecifických pre miestne nastavenie. V európskych regiónoch môže čiarka predstavovať desatinné miesto. Napríklad „4000,1“ môže predstavovať desatinné číslo „4000,1“.

Štandardne dostaneme NumberFormatException pokusom o analýzu hodnoty obsahujúcej čiarku:

double aDoublePrim = Double.parseDouble ("4000,1");

Musíme v tomto prípade povoliť čiarky a vyhnúť sa výnimke. Aby to bolo možné, musí Java tu chápať čiarku ako desatinné miesto.

Môžeme povoliť čiarky pre európsky región a vyhnúť sa výnimke použitím NumberFormat.

Pozrime sa na to pomocou Miestne nastavenie pre Francúzsko napríklad:

NumberFormat numberFormat = NumberFormat.getInstance (Locale.FRANCE); Číslo parsedNumber = numberFormat.parse ("4000,1"); assertEquals (4000,1, parsedNumber.doubleValue ()); assertEquals (4000, parsedNumber.intValue ()); 

3. Osvedčené postupy

Hovorme o niekoľkých osvedčených postupoch, ktoré nám môžu pomôcť pri riešení NumberFormatException:

  1. Nepokúšajte sa prevádzať abecedné alebo špeciálne znaky na čísla - Java Number API to nedokáže.
  2. Možno budeme chcieť overte vstupný reťazec pomocou regulárnych výrazov a urobte výnimku pre neplatné znaky.
  3. Môžeme dezinfikovať vstup proti predvídateľným známym problémom pomocou metód ako trim () a nahradiť všetko().
  4. V niektorých prípadoch môžu byť platné špeciálne znaky na vstupe. Robíme pre to špeciálne spracovanie, pomocou NumberFormat, napríklad ktorá podporuje početné formáty.

4. Záver

V tomto tutoriáli sme diskutovali NumberFormatException v Jave a čo to spôsobuje. Pochopenie tejto výnimky nám môže pomôcť pri vytváraní robustnejších aplikácií.

Ďalej sme sa naučili stratégie, ako sa vyhnúť výnimke pomocou niektorých neplatných vstupných reťazcov.

Na záver sme videli niekoľko osvedčených postupov pri riešení problémov NumberFormatException.

Ako obvykle, zdrojový kód použitý v príkladoch nájdete na GitHub.


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