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:
- Ikke prøv å konvertere alfabetiske eller spesialtegn til tall - Java Number API kan ikke gjøre det.
- Det kan være lurt valider en inngangsstreng ved å bruke regulære uttrykk, og kast unntaket for ugyldige tegn.
- Vi kan desinfisere innspill mot påregnelige kjente problemer med metoder som listverk() og erstatt alle ().
- 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.