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:
- Ne próbáljon ábécé vagy speciális karaktereket számokká konvertálni - a Java Number API nem képes erre.
- 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.
- A belátható, ismert problémákkal szemben a bevitelt olyan módszerekkel tisztíthatjuk meg, mint a trim () és csereAll ().
- 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.