0

Donc j'écris du code ici juste pour m'amuser mais j'ai trouvé une erreur que je n'arrive pas à résoudre. Ce bloc de code est censé prendre un int ... au début j'ai eu le hasNextInt() dans la boucle while tout seul pour essayer de m'assurer que je reçois la bonne entrée, mais comme le destin l'aurait fait ... j'ai eu le exception. J'ai ensuite ajouté une tentative d'attraper en pensant peut-être que je viens de faire quelque chose de mal ... et encore je reçois la même erreur. Je ne sais pas ce qui ne va pas ici. C'est en fait ma première fois en utilisant un bloc try catch (encore un peu un noob). ça me va bien et j'ai regardé la documentation en ligne et fait quelques recherches mineures mais en vain. quelqu'un peut-il identifier ce qui est mal ici? check it out:InputMismatchException ... même avec try/catch

do{ 
    System.out.println("How much AP do you want to allocate towards HP? "); 

    try {//added try catch... still throwing the exception.. 

     while(!in.hasNextInt()){//this should've been enough, apparently not 
      System.out.println("That is not a valid input, try again."); 
      in.nextInt(); 
      } 
    } catch (InputMismatchException e) { 
     System.out.print(e.getMessage()); //trying to find specific reason. 
    } 
    hpInput = in.nextInt(); 
}while(hpInput < 0 || hpInput > AP); 

si je suis entré dans une chaîne, il me donnerait la « Ce n'est pas une entrée valide, essayez à nouveau. » ligne .. mais l'exception se produirait encore juste après au lieu de simplement boucler jusqu'à ce qu'un int réel est détecté ... help plz ..

+0

Vous posez la question à l'envers, vous vérifiez si l'entrée est valide et demandez à l'utilisateur d'entrer une nouvelle valeur ... Il pourrait être préférable d'obtenir l'entrée sous forme de 'String' et ensuite utiliser un autre 'Scanner' pour le valider ... – MadProgrammer

+0

Je vois ... ok, je vais essayer maintenant, merci. –

Répondre

0

Vous ne pouvez pas vraiment valider la valeur dans le Scanner jusqu'à ce que quelque chose a été entré, mais une fois qu'il est entrée, il est trop tard pour valider ...

au lieu de cela, vous pouvez utiliser une seconde Scanner pour valider le par exemple

Scanner kbd = new Scanner(System.in); 
int result = -1; 
do { 
    System.out.println("How much AP do you want to allocate towards HP? "); 
    String value = kbd.nextLine(); 
    Scanner validate = new Scanner(value); 
    if (validate.hasNextInt()) { 
     result = validate.nextInt(); 
    } 
} while (result < 0); 
+0

Alors laissez-moi juste essayer de comprendre ceci plus ... la valeur ici = kbd.nextLine() que je pensais était seulement pour les entrées de chaîne? Cependant, si un int est entré à la place d'une chaîne ... il l'accepte simplement. Est-ce que je manque quelque chose? D'accord, cela fonctionne maintenant, donc merci beaucoup, je suis juste en train d'essayer de vraiment comprendre ce que le code fait ici. –

+0

Oui, 'kdb.nextLine' reprend tout le nouveau marqueur de ligne de l'entrée et le retourne comme un' String', alors vous pouvez effectuer une "validation" supplémentaire en utilisant un 'scanner 'séparé, dans ce cas ... – MadProgrammer

2
résultat String que vous obtenez de l'utilisateur via le clavier,

Votre while boucle devrait ressembler à quelque chose comme

while(!in.hasNextInt()){ // <-- is there an int? 
    System.out.println("That is not a valid input, try again."); 
    // in.nextInt(); // <-- there is not an int... 
    in.next(); // <-- this isn't an int. 
} 

Parce que le Scanner n'a pas int.