-1

Je travaille sur ce code qui prend un entier comme un cas de test puis prend une chaîne et un entier pour chaque cas de test Mais je continue à obtenir cette exception:Impossible d'utiliser le scanner pour la chaîne et l'entier en même temps

Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at OverSizedPancakeFlipper.main(OverSizedPancakeFlipper.java:18) 

Mon code ressemble fondamentalement ceci:

Scanner userInput = new Scanner(System.in); 
int T=userInput.nextInt(); 

userInput.nextLine(); 
while(T-->0){ 
    String S=userInput.nextLine(); 
    char[] ch = S.toCharArray(); 
    int K=userInput.nextInt(); 
    //code does work here 
} 

Ne laissez-moi savoir si vous avez besoin d'autres informations et merci pour toute l'aide.

+0

Quelle est l'entrée? – BackSlash

+0

@BackSlash La première ligne de l'entrée donne le nombre de cas de test, les cas de test T. T suivent. Chaque chaîne consiste en une ligne avec une chaîne S et un entier K. La chaîne consiste en une série de symboles + et -. –

+0

Je voulais dire, qu'est-ce que vous fournissez en entrée? Fournissez-nous des exemples de données qui démontrent le problème, afin que nous puissions vous dire ce qui se passe – BackSlash

Répondre

0

Scanner userInput = nouveau Scanner (System.in);

do{ 
    String s=userInput.nextLine(); 
    char[] ch = s.toCharArray(); 
    int k=userInput.nextInt(); 
    //code does work here 
}while(k==0); 

vous pouvez utiliser .....

+0

n'a pas résolu mon problème.pouvez-vous expliquer pourquoi vous avez décidé d'opter pour un faire en boucle? –

+0

Donc, fondamentalement, il vous demandera d'entrer la chaîne pendant que k = 0, il vous donne la possibilité d'entrer la chaîne avant de vérifier les autres conditions – Avreen

0

Changer votre code

while(variableName==0){ 
    ... 
} 

lors de l'écriture d'une boucle while: vous voulez vous assurer que la boucle arrêter à point actuel, de sorte qu'il ne va pas pour toujours.

+0

Formatez votre code afin qu'il soit plus facile de voir le texte et l'extrait de code. –

0

Modifier cette ligne:

int K=userInput.nextInt(); 

à ceci:

int K=Integer.parseInt(userInput.nextLine()); 

Bien sûr, vous aurez besoin pour gérer NumberFormatException.

Pour une explication de ce changement, voir double question Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods

En bref, le problème est que vous avez oublié de lire la nouvelle ligne après l'entier. Alors, nextLine prendra la chaîne vide et consommera la nouvelle ligne. Ensuite, nextInt échouera car il est positionné sur un contenu non valide.

+0

Pour éviter le comportement, vous devez simplement appeler 'userInput.nextLine()' avant le 'nextInt()'. Pas besoin d'analyser l'int vous-même, ignorez simplement une ligne, comme le suggère la réponse que vous avez reliée. – BackSlash

+0

@BackSlash Je suis conscient qu'il existe plusieurs façons de le résoudre, oui. Mais la réponse liée dit "ce serait encore mieux" de faire de cette façon. P.S. appeler nextLine avant nextInt comme vous le suggérez ne fonctionnerait pas. Au lieu de cela, vous devrez l'appeler après nextInt. Personnellement, cela me semble un peu hack. Vous ignorez potentiellement les données sur la ligne qui a suivi l'entier. –