Forstå NumberFormatException i Java

1. Introduksjon

Java kaster NumberFormatException - et ukontrollert unntak - når det ikke kan konvertere et String til en nummertype.

Siden det ikke er merket av, tvinger Java oss ikke til å håndtere eller erklære det.

I denne raske opplæringen vil vi beskrive og demonstrere hva forårsaker NumberFormatException i Java og hvordan du kan unngå eller håndtere det.

2. Årsaker til NumberFormatException

Det er forskjellige problemer som forårsaker NumberFormatException. For eksempel kaster noen konstruktører og metoder i Java dette unntaket.

Vi vil diskutere de fleste av dem i avsnittene nedenfor.

2.1. Ikke-numeriske data sendt til konstruktør

La oss se på et forsøk på å konstruere en Heltall eller Dobbelt objekt med ikke-numeriske data.

Begge disse uttalelsene vil kaste NumberFormatException:

Heltall aHeltallObj = nytt heltall ("ett"); Double doubleDecimalObj = new Double ("two.2");

La oss se stabelsporet vi fikk da vi sendte ugyldig inndata "en" til Heltall konstruktør i linje 1:

Unntak i tråden "main" java.lang.NumberFormatException: For input streng: "one" på java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) på java.lang.Integer.parseInt (Integer.java:580) kl. java.lang.Integer. (Integer.java:867) på MainClass.main (MainClass.java:11)

Det kastet NumberFormatException. De Heltall konstruktøren mislyktes mens han prøvde å forstå innspill ved hjelp av parseInt () internt.

Java Number API analyserer ikke ord i tall, så vi kan korrigere koden ved å endre den til en forventet verdi:

Heltall aHeltallObj = nytt heltall ("1"); Double doubleDecimalObj = new Double ("2.2");

2.2. Analyse av strenger som inneholder ikke-numeriske data

I likhet med Java's støtte for parsing i konstruktøren, har vi dedikerte analyseringsmetoder som parseInt (), parseDouble (), verdien av(), og dekode().

Hvis vi prøver å gjøre de samme konverteringene med disse:

int aIntPrim = Integer.parseInt ("to"); doble aDoublePrim = Double.parseDouble ("to. to"); Integer aIntObj = Integer.valueOf ("tre"); Long decodedLong = Long.decode ("64403L");

Så får vi se den samme typen feilaktig oppførsel.

Og vi kan fikse dem på lignende måter:

int aIntPrim = Integer.parseInt ("2"); doble aDoublePrim = Double.parseDouble ("2.2"); Integer aIntObj = Integer.valueOf ("3"); Long decodedLong = Long.decode ("64403");

2.3. Passere strenger med fremmede tegn

Eller hvis vi prøver å konvertere en streng til et tall med fremmede data i inndata, som mellomrom eller spesialtegn:

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

Så får vi det samme problemet som før.

Vi kunne rette opp disse med litt strengmanipulering:

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

Merk her i linje 3 at negative tall er tillatt, ved å bruke bindestrektegnet som minustegn.

2.4. Lokalspesifikke tallformater

La oss se et spesielt tilfelle av stedsspesifikke tall. I europeiske regioner kan et komma representere en desimal. For eksempel kan “4000,1” representere desimaltallet “4000,1”.

Som standard får vi det NumberFormatException ved å prøve å analysere en verdi som inneholder komma:

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

Vi må tillate komma og unngå unntaket i dette tilfellet. For å gjøre dette mulig, trenger Java å forstå kommaet her som en desimal.

Vi kan tillate komma for den europeiske regionen og unngå unntaket ved å bruke NumberFormat.

La oss se det i aksjon ved hjelp av Lokal for Frankrike som eksempel:

NumberFormat numberFormat = NumberFormat.getInstance (Locale.FRANCE); Number parsedNumber = numberFormat.parse ("4000,1"); assertEquals (4000.1, parsedNumber.doubleValue ()); assertEquals (4000, parsedNumber.intValue ()); 

3. Beste praksis

La oss snakke om noen gode fremgangsmåter som kan hjelpe oss å håndtere NumberFormatException:

  1. Ikke prøv å konvertere alfabetiske eller spesialtegn til tall - Java Number API kan ikke gjøre det.
  2. Det kan være lurt valider en inngangsstreng ved å bruke regulære uttrykk, og kast unntaket for ugyldige tegn.
  3. Vi kan desinfisere innspill mot påregnelige kjente problemer med metoder som listverk() og erstatt alle ().
  4. I noen tilfeller kan spesialtegn i input være gyldige. Så vi gjør spesiell behandling for det ved hjelp av Antallformat, for eksempel som støtter mange formater.

4. Konklusjon

I denne opplæringen diskuterte vi NumberFormatException i Java og hva som forårsaker det. Å forstå dette unntaket kan hjelpe oss med å lage mer robuste applikasjoner.

Videre lærte vi strategier for å unngå unntaket med noen ugyldige inputstrenger.

Til slutt så vi noen gode fremgangsmåter for å håndtere NumberFormatException.

Som vanlig kan kildekoden som brukes i eksemplene finnes på GitHub.


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