Comment gérer NumberFormatException

Feb 22 2023
· Qu'est-ce qu'une exception ?· NumberFormatException ∘ Hiérarchie ∘ Syntaxe ∘ Quelles sont les causes de NumberFormatException ∘ Comment gérer NumberFormatException· Exemples pour implémenter NumberFormatException en Java ∘ Exemple #1 ∘ Exemple #2· Éviter NumberFormatException Qu'est-ce qu'une exception ? Le NumberFormatException est une exception non vérifiée en Java qui se produit lorsqu'une tentative est faite pour convertir une chaîne avec un format incorrect en une valeur numérique. NumberFormatException est une classe intégrée à Java qui est définie dans Java.
src

· Qu'est-ce qu'une exception ?
· NumberFormatException
∘ Hiérarchie
∘ Syntaxe
∘ Quelles sont les causes de NumberFormatException
∘ Comment gérer NumberFormatException
· Exemples pour implémenter NumberFormatException en Java
∘ Exemple #1
∘ Exemple #2
· Éviter NumberFormatException

Qu'est-ce qu'une exception ?

  • Dans son sens le plus général, une exception est un problème qui apparaît au moment de l'exécution, qui ne peut pas être anticipé par un programme Java général et qui doit être spécialement géré par le programmeur.
  • Types courants d'exception : FileNotFoundException , ClassNotFoundException , IndexOutOfBoundsException

Le NumberFormatException est une exception non vérifiée en Java qui se produit lorsqu'une tentative est faite pour convertir une chaîne avec un format incorrect en une valeur numérique.

NumberFormatException est une classe intégrée à Java qui est définie dans le package Java.lang.NumberFormatException . La classe IllegalArgumentException est une superclasse de NumberFormatException car il s'agit d'une exception non contrôlée, elle n'est donc pas obligée de la gérer et de la déclarer.

Dans un programme Java, l'entrée de l'utilisateur est parfois acceptée via des arguments de ligne de commande en tant que champ de texte sous la forme d'une chaîne. Et pour utiliser cette chaîne dans certaines opérations arithmétiques, elle doit d'abord analyser ou convertir en types de données (type numérique spécifique) en utilisant les fonctions parseXXX() des classes wrapper

NumberFormatException est levée lorsqu'il n'est pas possible de convertir une chaîne en un type numérique (par exemple, int, float), car le format d'une chaîne d'entrée est illégal et inapproprié. Par exemple, cette exception se produit si une chaîne est tentée d'être analysée en entier mais que la chaîne contient une valeur booléenne.

Hiérarchie

La hiérarchie de la classe NumberFormatException est :

Objet -> Jetable -> Exception -> RuntimeException -> NumberFormatException

Syntaxe

Voici la déclaration de la classe java.lang.NumberFormatException .

public class NumberFormatException extends IllegalArgumentException implements Serializable
{
// Constructors of the NumberFormatException class
}

IllegalArgumentException class and implements Serializabletion.

L' exception NumberFormatException se produit lorsqu'une tentative est faite pour convertir une chaîne avec un format incorrect en une valeur numérique . Cela signifie que lorsqu'il n'est pas possible de convertir une chaîne dans n'importe quel type numérique (float, int, etc.), cette exception est levée. C'est une exception d'exécution (exception non vérifiée) en Java. C'est une sous-classe de la classe IllegalArgumentException . Pour gérer cette exception, try – catch block peut être utilisé.

Lorsque nous opérons sur des chaînes, nous devons parfois convertir un nombre représenté sous forme de chaîne en un type numérique. La méthode généralement utilisée pour convertir String en Integer en Java est parseXXXX() .

L' exception NumberFormatException peut être lancée par de nombreuses méthodes/constructeurs dans les classes du package java.lang . Voici quelques-uns d'entre eux.

  • public static int parseInt(String s) lance NumberFormatException
  • public static Byte valueOf(String s) lève NumberFormatException
  • octet statique public parseByte(String s) lance NumberFormatException
  • octet statique public parseByte(String s, int radix) lance NumberFormatException
  • public Integer(String s) lève NumberFormatException
  • public Byte(String s) lève NumberFormatException

prenons parseInt() comme exemple

Utilisation de la méthode parseInt() : Comme nous le savons déjà, il existe deux variantes de cette méthode, à savoir comme suit pour mieux comprendre

public static int parseInt(String s) throws NumberFormatException
This function parses the string argument as a signed decimal integer.
public static int parseInt(String s, int radix) throws NumberFormatException
This function parses the string argument as a 
signed integer in the radix specified by the second argument.

Constructeurs :

  1. public NumberFormatException() : construit une NumberFormatException sans message détaillé.
  2. public NumberFormatException(String msg): Construit une NumberFormatException avec le message de détail 'msg'
  • La chaîne s est nulle ou la longueur de s est nulle.
  • Si la chaîne s contient des caractères non numériques.
  • La valeur de String s ne représente pas un entier.

Integer.parseInt("null") ;

Float.parseFloat(“”) ;

Examinons une tentative de construction d'un objet Integer ou Double avec des données non numériques.

Ces deux instructions lèveront NumberFormatException :

Integer aIntegerObj = new Integer("one");
Double doubleDecimalObj = new Double("two.2");"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

Exception in thread "main" java.lang.NumberFormatException: For input string: "one"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.<init>(Integer.java:867)
	at MainClass.main(MainClass.java:11)"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

L'API Java Number n'analyse pas les mots en nombres, nous pouvons donc corriger le code en le remplaçant simplement par une valeur attendue :

Integer aIntegerObj = new Integer("1");
Double doubleDecimalObj = new Double("2.2");

Semblable à la prise en charge de Java pour l'analyse dans le constructeur, nous avons des méthodes d'analyse dédiées telles que parseInt(), parseDouble(), valueOf() et decode().

Si nous essayons de faire les mêmes types de conversion avec ceux-ci :

int aIntPrim = Integer.parseInt("two");
double aDoublePrim = Double.parseDouble("two.two");
Integer aIntObj = Integer.valueOf("three");
Long decodedLong = Long.decode("64403L");"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

Et, nous pouvons les réparer de manière similaire :

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

Double.parseDouble(“ThirtyFour”);

Integer.valueOf(“31.two”);

Ou, si nous essayons de convertir une chaîne en un nombre avec des données superflues en entrée, comme des espaces ou des caractères spéciaux :

Short shortInt = new Short("2 ");
int bIntPrim = Integer.parseInt("_6000");"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

Nous pourrions les corriger avec un peu de manipulation de chaîne :

Short shortInt = new Short("2 ".trim());
int bIntPrim = Integer.parseInt("_6000".replaceAll("_", ""));
int bIntPrim = Integer.parseInt("-6000");"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

La chaîne d'entrée avec des espaces blancs au début et/ou à la fin

Integer abc=new Integer(“  432 “);

Float.parseFloat(4-236);
Float.parseFloat(4,236);
Float.parseFloat(56*);

Voyons un cas particulier de numéros spécifiques aux paramètres régionaux. Dans les régions européennes, une virgule peut représenter une décimale. Par exemple, "4000,1" peut représenter le nombre décimal "4000,1".

Par défaut, nous obtiendrons NumberFormatException en essayant d'analyser une valeur contenant une virgule :

double aDoublePrim = Double.parseDouble("4000,1");"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

Nous pouvons autoriser les virgules pour la région européenne et éviter l'exception en utilisant NumberFormat .

Voyons-le en action en utilisant les paramètres régionaux pour la France comme exemple :

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

Integer.parseInt(“1326589741236”);

Integer.parseInt("13.26");

public class NumberFormatExceptionTest {
   public static void main(String[] args){
      int x = Integer.parseInt("30k");
      System.out.println(x);
   }
}

Exception in thread "main" java.lang.NumberFormatException: For input string: "30k"
       at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
       at java.lang.Integer.parseInt(Integer.java:580)
       at java.lang.Integer.parseInt(Integer.java:615)
       at NumberFormatExceptionTest.main(NumberFormatExceptionTest.java:3)

Nous pouvons gérer l' exception NumberFormatException de deux manières

  • Utilisez le bloc try et catch entourant le code qui peut provoquer NumberFormatException .
  • Une autre façon de gérer l'exception est l'utilisation du mot-clé throws .

public class NumberFormatExceptionHandlingTest {
   public static void main(String[] args) {
      try {
         new NumberFormatExceptionHandlingTest().intParsingMethod();
      } catch (NumberFormatException e) {
         System.out.println("We can catch the NumberFormatException");
      }
   }
   public void intParsingMethod() throws NumberFormatException{
      int x = Integer.parseInt("30k");
      System.out.println(x);
   }
}

Sortir

We can catch the NumberFormatException

Ci-dessous des exemples à mettre en œuvre :

Exemple 1

Ensuite, nous écrivons le code Java pour comprendre plus clairement l'exception NumberFormatException avec l'exemple suivant où nous créons un objet PrintWriter en utilisant le constructeur de classe PrintWriter et transmettons le nom du fichier à écrire, comme ci-dessous -

Code:

//package p1;
import java.util.Scanner;
public class Demo
{
public static void main( String[] arg) {
int age;
Scanner sc = new Scanner(System.in);
System.out.println("Please Enter your age : ");
//throws Exception as if the input string is of illegal format for parsing as it as null or alphanumeric.
age = Integer.parseInt(sc.next());
System.out.println("Your age is : " +age);
}
}

Lorsque l'utilisateur entre "25+", une sortie du code ci-dessus est :

Please Enter your age: 25+
Exception in thread "main" java.lang.NumberFormatException: For input string: "25+" 
    at java.lang.NumberFormatException.for InputString (NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Main.main (Main.java:11)

Please Enter your age: 25F 
Exception in thread "main" java.lang.NumberFormatException: For input string: "25F"
    at java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Main.main (Main.java:11)

Please Enter your age: Twenty Five 
Exception in thread "main" java.lang.NumberFormatException: For input string: "Twenty" 
    at java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Main.main (Main.java:11)

Please Enter your age: null
Exception in thread "main" java.lang.NumberFormatException: For input string: "null"
    at java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Main.main (Main.java:11)

Please Enter your age: 25.5
Exception in thread "main" java.lang.NumberFormatException: For input string: "25.5"
    at java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Main.main (Main.java:11)

Please Enter your age: 25 :
25
Your age is 25

Exemple #2

Ensuite, nous écrivons le code Java pour comprendre le NumberFormatException où nous générons le NumberFormatException et le gérons en utilisant le bloc try-catch dans le programme, comme ci-dessous -

Code:

//package p1;
import java.util.Scanner;
public class Demo
{
public static void main( String[] arg) {
int age;
Scanner sc = new Scanner(System.in);
try
{
System.out.println("Please Enter your age : ");
//throws Exception as if the input string is of illegal format for parsing as it as null or alphanumeric.
age = Integer.parseInt(sc.next());
System.out.println("Your age is : " +age);
} catch(NumberFormatException e)
{
System.out.println("The NumberFormatException occure.");
System.out.println("Please enter the valid age.");
}
}
}

Please Enter your age :
23F
The NumberFormatException occure.
Please enter the valid age.

Please Enter your age :
23
Your age is 23

Éviter NumberFormatException

Parlons de quelques bonnes pratiques qui peuvent nous aider à gérer NumberFormatException :

  1. N'essayez pas de convertir des caractères alphabétiques ou spéciaux en nombres - l'API Java Number ne peut pas le faire.
  2. Nous pouvons souhaiter valider une chaîne d'entrée à l'aide d'expressions régulières et lever l'exception pour les caractères non valides .
  3. Nous pouvons nettoyer les entrées contre les problèmes connus prévisibles avec des méthodes telles que trim() et replaceAll() .
  4. Dans certains cas, les caractères spéciaux en entrée peuvent être valides. Donc, nous faisons un traitement spécial pour cela, en utilisant NumberFormat, par exemple, qui prend en charge de nombreux formats .

Il est recommandé de vérifier si la chaîne transmise est numérique ou non avant d'essayer de la convertir en entier.

Merci d'avoir lu. Bon apprentissage

Rejoindre Mouad Oumous Java WhatsApp Group REJOINDRE

Rejoindre Mouad Oumous Telegram Channel REJOINDRE

Soutenez notre publication en la suivant

Consultez également les articles suivants

Java — 8 | Interface BiFunction, BiConsumer & BiPredicate avec exemple Qui façonne l'avenir mondial de l'énergie ? 3 faits que vous ne saviez pas sur Londres Astuces pour que la console JavaScript améliore votre capacité de débogage 10 outils de développement pour le développement en réagissez au code comme un pro — Partie 2