2017-10-03 6 views
-1

Salut, je suis un débutant en Java et j'essaye d'écrire ce programme où je peux entrer des nombres, mais quand j'entre "done", j'obtiens les valeurs que j'ai appelées total , nombreEntrées. Cependant, quand je l'exécute et que j'ai entré "fait" je reçois une exception dans le fil "principal" java.lang.NumberFormatException: Pour la chaîne d'entrée: "fait". Savez-vous comment je peux résoudre ce problème s'il vous plaît?Comment puis-je résoudre une NumberFormatException en java

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 repeat.numberReader(repeat.java:15) 
at repeat.main(repeat.java:23) 

Ceci est mon code:

import java.util.Scanner; 

public class repeat{ 
    public void numberReader(){ 
     Scanner myScanner = new Scanner(System.in); 
     int total = 1; 
     int numberInputs = 1; 
     String userInput; 

     do { 
      System.out.println("Enter a number: "); 
      userInput = myScanner.nextLine(); 
      total = total + Integer.parseInt(userInput); 
      numberInputs++; 
     } while (!"done".equals(userInput)); 
     System.out.println(total + "" + numberInputs + "" + (total/numberInputs)); 
    } 

    public static void main(String[] args){ 
     repeat instance = new repeat(); 
     instance.numberReader(); 
    } 
} 

Merci pour votre aide

+0

Vous ne pouvez pas convertir les mots en chiffres. "Terminé" est un mot qui ne peut pas être analysé en entier. Il est lié à vous donner cette erreur. Vérifiez l'autre question pointée par nullpointer. – Yashovardhan

Répondre

1

Vous regardez userInput pour la valeur "done", mais vous le faites après l'appel à Integer.parseInt(). L'appel Integer.parseInt("done") lève l'exception NumberFormatException car la chaîne "done" ne peut pas être analysée en tant qu'entier.

do { 
    System.out.println("Enter a number: "); 
    userInput = myScanner.nextLine(); 
    ***ERROR HERE*** 
    total = total + Integer.parseInt(userInput); 
    numberInputs++; 
} while (!"done".equals(userInput)); 
    System.out.println(total + "" + numberInputs + "" + (total/numberInputs)); 
} 

Vous pouvez résoudre ce problème de deux façons. Le plus simple serait de réorganiser votre code afin que vous vérifiiez l'entrée immédiatement après l'avoir reçu et que vous l'analysiez seulement après. Cela nécessite d'avoir l'invite deux fois (une fois avant la boucle et une fois au bas de celle-ci.) Il y aura également des problèmes si la première entrée est "done" car une boucle do-while est toujours exécutée au moins une fois. boucle while pour éviter cela. cela ne gère également les chaînes autres que votre chaîne "done" attendue.

System.out.println("Enter a number: "); 
userInput = myScanner.nextLine(); 
do { 
    total = total + Integer.parseInt(userInput); 
    numberInputs++; 
    System.out.println("Enter a number: "); 
    userInput = myScanner.nextLine(); 
} while (!"done".equals(userInput)); 
    System.out.println(total + "" + numberInputs + "" + (total/numberInputs)); 
} 

manutention vous pouvez également mettre en œuvre une erreur pour attraper et gérer l'exception, mais qui est un peu plus compliqué. ce ressemble à des devoirs, et le traitement des erreurs est probablement hors de votre portée, donc je considérerais juste la première option.En remarque, vous devriez envisager de remplacer "done".equals(userInput) par userInput.equals("done"). Ils sont fonctionnellement identiques, mais la deuxième déclaration est beaucoup plus claire ce que votre intention est, qui est de voir si userInput est "done". Le premier est plus difficile pour vous et les autres à lire et à comprendre.

0

vous devez vérifier si l'entrée est « fait » avant d'utiliser Integer.parseInt(userInput)

 do { 
      System.out.println("Enter a number: "); 
      userInput = myScanner.nextLine(); 
      if(!"done".equals(userInput)){ 
      total = total + Integer.parseInt(userInput); 
      numberInputs++; 
      } 

     } while (!"done".equals(userInput)); 
      System.out.println(total + "" + numberInputs + "" + (total/numberInputs)); 
     } 
0

Comme indiqué par le site: NumberFormatException, l'exception est provoquée en essayant de convertir une chaîne qui ne représente pas un numéro, à un entier, dans ce cas: « fait »

L'exception est déclenchée dans cette ligne:

total = total + Integer.parseInt(userInput); 

Vous pouvez éviter et ha NDLE cette exception comme suit:

public class repeat{ 
    public void numberReader(){ 
     Scanner myScanner = new Scanner(System.in); 
     int total = 1; 
     int numberInputs = 1; 
     String userInput; 

     boolean done = false; // Stop when true 

     do { 
      System.out.println("Enter a number: "); 
      userInput = myScanner.nextLine(); 
      try{  // Managing the exception 
       total = total + Integer.parseInt(userInput); 
      } catch(NumberFormatException e){ 
       if ("done".equals(userInput)){ // it's done!!!! 
        done = true; 
       } 
      } 
      numberInputs++; 
     } while (!done); 
      System.out.println(total + "" + numberInputs + "" + (total/numberInputs)); 
     } 

    public static void main(String[] args){ 
     repeat instance = new repeat(); 
     instance.numberReader(); 
    } 
} 

Read more about the try/catch

1

Le problème avec votre code est dans cette ligne

total = total + Integer.parseInt(userInput); 

utilisateur Suppose entre la chaîne "fait".

maintenant votre code va essayer d'analyser la chaîne en entier à savoir

total=total+Integer.parseInt("done"); 

Par conséquent, NumberFormatException se produira.

Le code correct sera

import java.util.Scanner; 

public class repeat{ 
    public void numberReader(){ 
     Scanner myScanner = new Scanner(System.in); 
     int total = 1; 
     int numberInputs = 1; 
     String userInput; 



     while (true) 
     { 
      System.out.println("Enter a number: "); 
      userInput = myScanner.nextLine(); 
      if("done".equals(userInput)) 
      { 
       System.out.println(total + "" + numberInputs + "" + (total/numberInputs)); 
       break; 
      } 
      else 
      { 
       total = total + Integer.parseInt(userInput); 
       numberInputs++; 
      } 
     } 
    } 

    public static void main(String[] args){ 
     repeat instance = new repeat(); 
     instance.numberReader(); 
    } 
} 
+0

J'ai essayé votre version mais j'ai toujours la même erreur de notification – hhppaarr

+0

pouvez-vous me dire la séquence d'entrée pour laquelle vous avez ce problème. – Karan