Razumijevanje NumberFormatException u Javi

1. Uvod

Java baca NumberFormatException - neprovjerena iznimka - kada ne može pretvoriti Niz na tip broja.

Budući da nije označen, Java nas ne prisiljava da to radimo ili deklariramo.

U ovom brzom vodiču opisat ćemo i demonstrirati što uzrokuje NumberFormatException u Javi i kako to izbjeći ili riješiti.

2. Uzroci NumberFormatException

Uzroci su različiti problemi NumberFormatException. Na primjer, neki konstruktori i metode u Javi bacaju ovu iznimku.

O većini ćemo raspravljati u odjeljcima u nastavku.

2.1. Nenumerički podaci proslijeđeni u konstruktor

Pogledajmo pokušaj konstrukcije Cijeli broj ili Dvostruko objekt s nenumeričkim podacima.

Obje ove izjave će baciti NumberFormatException:

Cijeli broj aIntegerObj = novi cijeli broj ("jedan"); Double doubleDecimalObj = novi Double ("two.2");

Pogledajmo trag steka koji smo dobili kada smo proslijedili nevaljani ulaz "jedan" u Cijeli broj konstruktor u retku 1:

Iznimka u niti "main" java.lang.NumberFormatException: Za ulazni niz: "one" na java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) na java.lang.Integer.parseInt (Integer.java:580) na java.lang.Integer. (Integer.java:867) na MainClass.main (MainClass.java:11)

Bacilo je NumberFormatException. The Cijeli broj konstruktor nije uspio dok je pokušavao razumjeti unos pomoću parseInt () iznutra.

Java Number API ne raščlanjuje riječi na brojeve, pa kôd možemo ispraviti jednostavnim mijenjanjem u očekivanu vrijednost:

Cijeli broj aIntegerObj = novi cijeli broj ("1"); Double doubleDecimalObj = novi Double ("2.2");

2.2. Raščlanjivanje nizova koji sadrže numeričke podatke

Slično Java podršci za raščlanjivanje u konstruktoru, imamo namjenske metode raščlanjivanja poput parseInt (), parseDouble (), vrijednost(), i dekodiraj ().

Ako pokušamo izvršiti iste vrste pretvorbe s ovim:

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

Tada ćemo vidjeti istu vrstu pogrešnog ponašanja.

I, možemo ih popraviti na slične načine:

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

2.3. Prolazne žice s tuđim likovima

Ili, ako pokušavamo pretvoriti niz u broj pomoću strani podaci u ulazu, poput razmaka ili posebnih znakova:

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

Tada ćemo imati isti problem kao i prije.

To bismo mogli ispraviti s malo manipulacije nizom:

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

Ovdje u retku 3 imajte na umu da dozvoljeni su negativni brojevi, koristeći crticu kao znak minus.

2.4. Formati brojeva specifični za lokalizaciju

Pogledajmo poseban slučaj brojeva specifičnih za lokalno područje. U europskim regijama zarez može predstavljati decimalno mjesto. Na primjer, "4000,1" može predstavljati decimalni broj "4000,1".

Prema zadanim postavkama dobit ćemo NumberFormatException pokušajem raščlambe vrijednosti koja sadrži zarez:

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

Moramo dopustiti zareze i u ovom slučaju izbjeći iznimku. Da bi to bilo moguće, Java ovdje zarez mora razumjeti kao decimalni znak.

Možemo dopustiti zareze za europsku regiju i izbjeći iznimku pomoću Format broja.

Pogledajmo to na djelu pomoću Lokalno za Francusku kao primjer:

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

3. Najbolji primjeri iz prakse

Razgovarajmo o nekoliko dobrih praksi koje nam mogu pomoći u rješavanju problema NumberFormatException:

  1. Ne pokušavajte pretvoriti abecedne ili posebne znakove u brojeve - Java Number API to ne može učiniti.
  2. Možda bismo htjeli provjerite valjanost ulaznog niza pomoću regularnih izraza i izbacite iznimku za nevaljane znakove.
  3. Ulazne podatke možemo sanirati protiv predvidljivih poznatih problema metodama poput obrezati () i zamjeni sve().
  4. U nekim slučajevima mogu biti valjani posebni znakovi u unosu. Dakle, za to radimo posebnu obradu, koristeći Format broja, na primjer, koji podržava brojne formate.

4. Zaključak

U ovom uputstvu smo razgovarali NumberFormatException u Javi i što to uzrokuje. Razumijevanje ove iznimke može nam pomoći u stvaranju robusnijih aplikacija.

Nadalje, naučili smo strategije za izbjegavanje iznimke s nekim nevaljanim ulaznim nizovima.

Napokon smo vidjeli nekoliko najboljih praksi za rješavanje NumberFormatException.

Kao i obično, izvorni kod koji se koristi u primjerima može se naći na GitHubu.