Inzicht in de NumberFormatException in Java

1. Inleiding

Java gooit NumberFormatException - een ongecontroleerde uitzondering - wanneer het een Draad naar een nummertype.

Omdat het niet is aangevinkt, dwingt Java ons niet om het af te handelen of te declareren.

In deze korte tutorial zullen we beschrijven en demonstreren wat veroorzaakt NumberFormatException in Java en hoe u dit kunt vermijden of ermee kunt omgaan.

2. Oorzaken van NumberFormatException

Er zijn verschillende problemen die de oorzaak zijn NumberFormatException. Sommige constructors en methoden in Java genereren bijvoorbeeld deze uitzondering.

We zullen de meeste ervan in de onderstaande secties bespreken.

2.1. Niet-numerieke gegevens doorgegeven aan Constructor

Laten we eens kijken naar een poging om een Geheel getal of Dubbele object met niet-numerieke gegevens.

Beide uitspraken zullen werpen NumberFormatException:

Geheel getal aIntegerObj = nieuw geheel getal ("één"); Double doubleDecimalObj = nieuwe Double ("two.2");

Laten we eens kijken naar de stacktrace die we kregen toen we ongeldige invoer "één" doorgaven aan de Geheel getal constructor in regel 1:

Uitzondering in thread "main" java.lang.NumberFormatException: Voor invoertekenreeks: "one" op java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) op java.lang.Integer.parseInt (Integer.java:580) op java.lang.Integer. (Integer.java:867) op MainClass.main (MainClass.java:11)

Het gooide NumberFormatException. De Geheel getal constructor is mislukt bij het begrijpen van invoer met parseInt () intern.

De Java Number API ontleedt geen woorden in getallen, dus we kunnen de code corrigeren door deze simpelweg te wijzigen in een verwachte waarde:

Geheel getal aIntegerObj = nieuw geheel getal ("1"); Double doubleDecimalObj = nieuwe Double ("2.2");

2.2. Parseringstrings die niet-numerieke gegevens bevatten

Net als Java's ondersteuning voor het parseren in de constructor, hebben we speciale parseermethoden zoals parseInt (), parseDouble (), waarde van(), en decoderen().

Als we proberen dezelfde soorten conversie met deze uit te voeren:

int aIntPrim = Integer.parseInt ("twee"); double aDoublePrim = Double.parseDouble ("two.two"); Geheel getal aIntObj = Geheel getal.valueOf ("drie"); Long decodedLong = Long.decode ("64403L");

Dan zullen we hetzelfde soort foutief gedrag zien.

En we kunnen ze op vergelijkbare manieren repareren:

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

2.3. Snaren doorgeven met vreemde karakters

Of, als we proberen een string om te zetten in een getal met externe gegevens in invoer, zoals witruimte of speciale tekens:

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

Dan hebben we hetzelfde probleem als voorheen.

We zouden deze kunnen corrigeren met een beetje stringmanipulatie:

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

Merk hier in regel 3 dat op negatieve getallen zijn toegestaan, waarbij het koppelteken als minteken wordt gebruikt.

2.4. Landspecifieke nummerformaten

Laten we eens kijken naar een speciaal geval van locale-specifieke nummers. In Europese regio's kan een komma een cijfer achter de komma vertegenwoordigen. "4000,1" kan bijvoorbeeld staan ​​voor het decimale getal "4000.1".

Standaard krijgen we NumberFormatException door te proberen een waarde te ontleden die een komma bevat:

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

We moeten komma's toestaan ​​en de uitzondering in dit geval vermijden. Om dit mogelijk te maken, moet Java de komma hier als een decimaal interpreteren.

We kunnen komma's toestaan ​​voor de Europese regio en de uitzondering vermijden door Nummer formaat.

Laten we het in actie zien met behulp van de Locale voor Frankrijk als voorbeeld:

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

3. Beste praktijken

Laten we het hebben over een paar goede praktijken die ons kunnen helpen ermee om te gaan NumberFormatException:

  1. Probeer geen alfabetische of speciale tekens om te zetten in cijfers - de Java Number API kan dat niet.
  2. We willen misschien valideer een invoertekenreeks met behulp van reguliere expressies en genereer de uitzondering voor de ongeldige tekens.
  3. We kunnen invoer opschonen tegen voorzienbare bekende problemen met methoden zoals bijsnijden () en vervang alles().
  4. In sommige gevallen kunnen speciale tekens die worden ingevoerd, geldig zijn. Daarom doen we daarvoor een speciale verwerking, met behulp van Nummer formaat, die bijvoorbeeld talrijke formaten ondersteunt.

4. Conclusie

In deze tutorial hebben we besproken NumberFormatException in Java en wat de oorzaak is. Als we deze uitzondering begrijpen, kunnen we robuustere applicaties maken.

Verder hebben we strategieën geleerd om de uitzondering met enkele ongeldige invoertekenreeksen te vermijden.

Ten slotte zagen we een paar best practices voor het omgaan met NumberFormatException.

Zoals gewoonlijk is de broncode die in de voorbeelden wordt gebruikt, te vinden op GitHub.