Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur Scanner : nextInt()

java.util.NoSuchElementException

    19 novembre 2020 à 20:07:33

    Bonjour, 

    Je sais que beaucoup de gens ont déjà rencontré ce problème, j'ai regardé leurs solutions mais je ne comprend pas pourquoi ca ne fonctionne toujours pas ...

    la première valeur que je rentre fonctionne mais à la deuxième j'ai une erreur : 

    Scanner scanner = new Scanner( System.in );
                do{
                    System.out.println("Nouvelle position ("+positionInf+"-"+positionSup+") : ");
                    nouvellePosition = scanner.nextInt();//La ligne où on m'indique l'erreur
                    scanner.nextLine();
                }while(nouvellePosition < positionInf || nouvellePosition > positionSup);
                
    scanner.close();


    • Partager sur Facebook
    • Partager sur Twitter
      20 novembre 2020 à 2:30:50

      Salut.

      Java est un langage sensible à la casse donc scanner est différent de Scanner
      Du coup réessayes avec :

      nouvellePosition = Scanner.nextInt();



      • Partager sur Facebook
      • Partager sur Twitter
        20 novembre 2020 à 7:55:40

        Pourquoi mettre une majuscule à "Scanner" car j'ai déclaré "scanner" sans majuscule ? 

        Abel Rudy a écrit:

        Salut.

        Java est un langage sensible à la casse donc scanner est différent de Scanner
        Du coup réessayes avec :

        nouvellePosition = Scanner.nextInt();

        Pourquoi mettre une majuscule à "Scanner" car j'ai déclaré "scanner" sans majuscule ? 



        • Partager sur Facebook
        • Partager sur Twitter
          20 novembre 2020 à 11:26:45

          Ton code est bon. Mais tu n'entres visiblement pas un entier.
          • Partager sur Facebook
          • Partager sur Twitter
            20 novembre 2020 à 11:42:00

            Scanner scPosition = new Scanner( System.in );
                    while((nouvellePosition<positionInf) || (nouvellePosition>positionSup))
                    {
                        System.out.println("scanner  : "+scPosition);
                        System.out.println("nouvelle Position  : ");
                        nouvellePosition=scPosition.nextInt();
                        scPosition.nextLine();
                    }
                    System.out.println("Tu as choisis : " + nouvellePosition);
                    scPosition.close();
            Je me suis dis que peut être en affichant le contenu du scanner que j'ai renommé scPosition pour m'aider à comprendre le problème : 
            Avant la première fois que je rentre un nombre scPosition m'affiche : 
            scanner  : java.util.Scanner
            [delimiters=\p{[match valid=false][need input=false][sourc][group separator=\x{202f}]
            [decimal separatnegative prefix=\Q-\E][positive suffix=][neNaN\E][infinity string=\Q?\E]
            Avant lorsque je redemande le scanner scPosition m'affiche cela : 
            scanner  : java.util.Scanner
            [delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\x{202f}]
            [decimal separator=\x{2c}][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\QNaN\E][infinity string=\Q?\E]
            Et ensuite j'ai l'erreur :
            Sinon je viens d'essayer une nouvelle instruction avec scPosition.hasNextInt(), 
            Au premier passage tout se passe bien, 
            mais au second, j'ai une boucle infinie...
            int positionInf = getPositionInf(numeroJoueur);
                    int positionSup = getPositionSup(numeroJoueur);
                    int nouvellePosition=-1;
            
                    Scanner scPosition = new Scanner( System.in );
            
                    while((nouvellePosition<positionInf) || (nouvellePosition>positionSup))
                    {
                        System.out.println("nouvelle Position  : ");
                        if(scPosition.hasNextInt())
                        {
                            nouvellePosition=scPosition.nextInt();
                        }
                            
                    }

            -
            Edité par NATHdb 20 novembre 2020 à 17:10:39

            • Partager sur Facebook
            • Partager sur Twitter
              20 novembre 2020 à 17:15:24

              Bonjour, 

              Je pense que le problème vient de scPosition.nextLine()

              Tu peux essayer ce code sinon :

              import java.util.*;
              import java.lang.*;
              
              public class HelloWorld{
              
                   public static void main(String []args){
                      Integer positionInf = null;
                      Integer positionSup = null;
                      
                      Scanner scPosition = new Scanner(System.in);
                      
                      System.out.println("Saisir position inferieure:");
                      do {
                          int value = scPosition.nextInt();
                          positionInf = new Integer(value);
                      } while (positionInf == null);
                      
                      System.out.println("Saisir position superieure:");
                      do {
                          int value = scPosition.nextInt();
                          positionSup = new Integer(value);
                      } while (positionSup == null);
                      
                      scPosition.close();
                      
                      System.out.println("Position inferieure = " + positionInf.intValue() + " ; Position superieure = " + positionSup.intValue());
                   }
              }



              • Partager sur Facebook
              • Partager sur Twitter

              L'informatique n'est pas parfait mais l'être humain non plus !

                20 novembre 2020 à 17:47:17

                thetui a écrit:

                Ton code est bon. Mais tu n'entres visiblement pas un entier.


                tu es sûr que tu n'es pas dans le cas où tu tapes autre chose qu'un entier ? (un flottant, une chaine font planter avec ce message d'erreur)

                traite ce cas via un try catch

                        while((nouvellePosition<positionInf) || (nouvellePosition>positionSup))
                        {
                            System.out.println("scanner  : "+scPosition);
                            System.out.println("nouvelle Position  : ");
                            try{
                                nouvellePosition=scPosition.nextInt();
                            }catch(Exception e)
                            {
                                System.out.println("erreur de saisie !");
                            }
                            scPosition.nextLine();
                        }
                        System.out.println("Tu as choisis : " + nouvellePosition);
                        scPosition.close();
                • Partager sur Facebook
                • Partager sur Twitter
                  20 novembre 2020 à 18:16:03

                  Oui je suis sûr c'est moi qui entre le chiffre, et si ca marche une seule fois mais pas la deuxieme
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 novembre 2020 à 1:03:47

                    Bonjour,

                    C'est un problème bien connu en Java que tout débutant rencontre, et étonnant de voir que personne ici ne l'a jamais rencontré.

                    Alors, oui nextInt() ne lit pas un entier, et non, @NATHdb n'est pas un abruti, il rentre bien un entier. C'est juste java.util.Scanner qui est pas du tout intuitif pour le coup.

                    https://www.geeksforgeeks.org/why-is-scanner-skipping-nextline-after-use-of-other-next-functions/.

                    La plupart des plateformes pour apprendre l'algo/la prog ou même des cours en Java proposent leur propre implémentation de Scanner pour régler ce problème d'ailleurs.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 novembre 2020 à 17:14:51

                      KoaTao a écrit:

                      Bonjour,

                      C'est un problème bien connu en Java que tout débutant rencontre, et étonnant de voir que personne ici ne l'a jamais rencontré.

                      Alors, oui nextInt() ne lit pas un entier, et non, @NATHdb n'est pas un abruti, il rentre bien un entier. C'est juste java.util.Scanner qui est pas du tout intuitif pour le coup.

                      https://www.geeksforgeeks.org/why-is-scanner-skipping-nextline-after-use-of-other-next-functions/.

                      La plupart des plateformes pour apprendre l'algo/la prog ou même des cours en Java proposent leur propre implémentation de Scanner pour régler ce problème d'ailleurs.

                      Alors si nextInt() renvoie un entier, la doc te le confirmera.

                      Personne n'a traité le PO d'abruti.

                      Et je ne vois pas le probleme dont tu parles, si tu pouvais nous exposer ta solution.

                      Pour revenir a ton lien on te dit juste que faire next() apres nextInt() te renvoie un retour chariot et pas de texte, ce qui explique le nextLine() en plus dans le code du PO.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 novembre 2020 à 19:02:29

                        la solution du lien c'est d'utiliser nexLine() et de convertir le résultat en entier

                        int var = Integer.parseInt(sc.nextLine());

                        Dans le post d'origine, il y avait bien le nextLine() pour consommer le retour chariot après le nextInt()

                        Sinon, encore une question qui peut paraître stupide, mais l'erreur se produit bien à cet endroit et pas un autre dans le fichier ? 

                        (si je pose des questions qui peuvent paraître stupide, c'est que parfois on oublie de vérifier certaines choses de bases ou qui semblent évidente et on s'entête à chercher ailleurs)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 novembre 2020 à 19:59:58

                          Autant pour moi, j'ai mal lu le code de l'OP, je pensais qu'il lisait une chaine de caractère après avoir lu l'entier (avec assignation à une variable), mais pas du tout en fait. ^^ Et j'ai mal lu l'erreur de toute manière qui n'a rien à voir en fait, donc totalement à côté pour ma part :(

                          (Quand je disais nextInt() ne lit pas un entier, je voulais dire que pour lui ce n'est pas un entier qui est rentré.)

                          Je trouvais ça par contre un peu dommage de lui dire plusieurs fois qu'il ne sait pas entrer un entier.

                          Je pense qu'umfred à raison, peut-être qu'il faut prendre en compte tout le code pour avoir le contexte exactement de comment il est exécuté, et ce qui pourrait empêcher Scanner de fonctionner correctement. NoSuchElement c'est qu'il n'y a rien à lire non ? Je veux dire, pas de Stream?

                          -
                          Edité par KoaTao 23 novembre 2020 à 20:01:39

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 novembre 2020 à 12:05:11

                            NoSuchElement pour moi c'est "pas d'élément de ce type" (sous entendu ici pas d'entier), c'est pour ça qu'on insistait sur le type de saisie
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 novembre 2020 à 14:07:43

                              Selon la doc, cette exception est déclenchée si l'input est "épuisée", ce qui je pense veut dire que non seulement il n'y a pas d'entier mais il n'y a RIEN (ou juste un retour chariot "\n").

                              Donc est-il possible que le PO nous dise exactement ce qu'il entre?

                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 novembre 2020 à 8:34:07

                                Si ce ne serait pas un entier qui serait lu mais autre chose, il aurait un autre type d'erreur:

                                https://docs.oracle.com/javase/7/docs/api/java/util/InputMismatchException.html

                                Par contre, son code fait partie d'un code plus vaste, et si par exemple, il a fait un sc.close(), il ferme le scanner et l'InputStreamReader System.in:

                                https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#close()

                                Donc ce code par exemple renvoie une exception de type NoSuchElementException:

                                import java.util.Scanner;
                                
                                class NoSuchElementExceptionExemple {
                                    public static void main (String[] args) {
                                        Scanner sc = new Scanner(System.in);
                                        System.out.println(sc.nextLine());
                                        sc.close();
                                        sc = new Scanner(System.in);
                                        System.out.println(sc.nextLine());
                                    }
                                }

                                 Il y a une exception parce que System.in est fermé la seconde fois.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 novembre 2020 à 10:27:03

                                  Toujours selon la doc, l'exception est différente si le scanner est fermé.

                                  Ici cela signifie que le scanner est ouvert mais qu'il n'y a rien à lire.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Erreur Scanner : nextInt()

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  • Editeur
                                  • Markdown