A Java-ban a NumberFormatException megértése

1. Bemutatkozás

Java dob NumberFormatException - ellenőrizetlen kivétel - amikor nem tudja konvertálni a Húr számtípusra.

Mivel nincs bejelölve, a Java nem kényszerít minket annak kezelésére vagy kijelentésére.

Ebben a gyors bemutatóban leírjuk és bemutatjuk milyen okok NumberFormatException Java-ban, és hogyan lehet elkerülni vagy kezelni.

2. okai NumberFormatException

Különböző kérdések okozzák NumberFormatException. Például a Java néhány konstruktora és metódusa ezt a kivételt elveti.

Legtöbbjüket az alábbi szakaszokban tárgyaljuk.

2.1. Nem számszerű adatok továbbítva a konstruktőrnek

Nézzünk meg egy kísérletet egy Egész szám vagy Kettős objektum nem numerikus adatokkal.

Mindkét állítás dobni fog NumberFormatException:

Egész szám aIntegerObj = új egész szám ("egy"); Double doubleDecimalObj = new Double ("kettő.2");

Lássuk a verem nyomát, amelyet akkor kaptunk, amikor érvénytelen „one” bemenetet adtunk át a Egész szám kivitelező az 1. sorban:

Kivétel a "main" szálban java.lang.NumberFormatException: A bemeneti karakterlánchoz: "one" a java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) a java.lang.Integer.parseInt (Integer.java:580) címen. java.lang.Integer. (Integer.java:867) a MainClass.main (MainClass.java:11) oldalon

Dobott NumberFormatException. A Egész szám a konstruktor meghiúsult, miközben megpróbálta megérteni az input használatát parseInt () belsőleg.

A Java Number API nem elemzi a szavakat számokká, így a kódot úgy javíthatjuk meg, hogy egyszerűen egy várható értékre változtatjuk:

Egész szám aIntegerObj = új egész szám ("1"); Double doubleDecimalObj = új Double ("2.2");

2.2. Nem numerikus adatokat tartalmazó karakterláncok elemzése

Hasonlóan a Java által a konstruktorban végzett elemzéshez nyújtott támogatáshoz, rendelkezünk olyan dedikált elemzési módszerekkel, mint a parseInt (), parseDouble (), értéke(), és dekódolni ().

Ha ugyanazokat a konverziókat próbáljuk megtenni ezekkel:

int aIntPrim = Integer.parseInt ("kettő"); double aDoublePrim = Double.parseDouble ("kettő.kettő"); Integer aIntObj = Integer.valueOf ("három"); Long decodedLong = Long.decode ("64403L");

Akkor ugyanezt a hibás viselkedést fogjuk tapasztalni.

És hasonló módon kijavíthatjuk őket:

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

2.3. Húrok átadása idegen karakterekkel

Vagy ha megpróbálunk egy karakterláncot számgá konvertálni idegen adatok a bemenetben, például szóköz vagy speciális karakterek:

Rövid shortInt = új Rövid ("2"); int bIntPrim = Integer.parseInt ("_ 6000");

Ezután ugyanaz lesz a kérdésünk, mint korábban.

Ezeket kijavíthatnánk egy kis karakterlánc-manipulációval:

Rövid shortInt = új Rövid ("2" .trim ()); int bIntPrim = Integer.parseInt ("_ 6000" .replaceAll ("_", "")); int bIntPrim = Integer.parseInt ("- 6000");

Itt jegyezzük meg a 3. sorban, hogy negatív számok megengedettek, a kötőjelet mínuszjelként használja.

2.4. Helyspecifikus számformátumok

Lássunk egy lokálspecifikus számok speciális esetét. Az európai régiókban a vessző tizedesjegyet jelenthet. Például a „4000,1” lehet a „4000,1” tizedesjegy.

Alapértelmezés szerint megkapjuk NumberFormatException vesszőt tartalmazó érték elemzésével:

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

Vesszőket kell engedélyeznünk, és ebben az esetben kerülnünk kell a kivételt. Ennek lehetővé tételéhez a Java-nak tizedesjegyként meg kell értenie az itt szereplő vesszőt.

Vesszőket engedélyezhetünk az európai régió számára, és használatával elkerülhetjük a kivételt NumberFormat.

Lássuk működés közben a Területi beállítás Franciaország esetében például:

NumberFormat numberFormat = NumberFormat.getInstance (Locale.FRANCE); Szám parsedNumber = számFormat.parse ("4000,1"); assertEquals (4000.1, parsedNumber.doubleValue ()); assertEquals (4000, parsedNumber.intValue ()); 

3. Legjobb gyakorlatok

Beszéljünk néhány jó gyakorlatról, amelyek segíthetnek a kezelésben NumberFormatException:

  1. Ne próbáljon ábécé vagy speciális karaktereket számokká konvertálni - a Java Number API nem képes erre.
  2. Lehet, hogy szeretnénk érvényesítsen egy bemeneti karakterláncot reguláris kifejezések használatával, és dobja ki az érvénytelen karakterek kivételét.
  3. A belátható, ismert problémákkal szemben a bevitelt olyan módszerekkel tisztíthatjuk meg, mint a trim () és csereAll ().
  4. Bizonyos esetekben a bevitt speciális karakterek érvényesek lehetnek. Tehát erre speciális feldolgozást végzünk NumberFormat, például számos formátumot támogat.

4. Következtetés

Ebben az oktatóanyagban megbeszéltük NumberFormatException Java-ban és mi okozza. Ennek a kivételnek a megértése segíthet abban, hogy robusztusabb alkalmazásokat hozzunk létre.

Ezenkívül megismertük a kivétel elkerülésére vonatkozó stratégiákat néhány érvénytelen beviteli karakterlánccal.

Végül néhány bevált gyakorlatot láttunk a kezeléssel kapcsolatban NumberFormatException.

Szokás szerint a példákban használt forráskód megtalálható a GitHub oldalon.