Classe Scanner qui bug

Bonjour,

J'ai une méthode run dans laquelle j'ai :

Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir un nombre :");
int str = sc.nextInt();
System.out.println("Vous avez saisi le nombre : " + str);


Quand j'arrive à Veuillez saisir un nombre :, je saisis un nombre mais çà ne passe pas à l'étape suivante c'est à dire Vous avez saisi le nombre :...

Je boucle en saisissant des données...

Que faire ? Je suis vraiment perdu !

Merci pour votre aide !

2 réponses

Résumé de la discussion

Un blocage survient lors de la saisie d'un nombre avec Scanner dans une méthode run, et l'affichage de « Vous avez saisi le nombre : ... » n'est jamais atteint, limitant le flux du programme. Plusieurs pistes sont évoquées, notamment l'interaction avec un fichier Fractal qui utilise Java et pourrait bloquer System.in/out, la possibilité d'appeler main depuis une autre méthode et le comportement des Threads. Des solutions pratiques proposées comprennent l'utilisation d'un seul Scanner sur System.in, son bloc synchronized, et la vérification de la gestion des entrées/sorties par Fractal pour éviter les blocages. En cas d'exécution en multithreading, tester avec un seul objet Scanner et isoler le code sans le fichier Fractal peut aider à identifier l'origine du blocage.

Bobot (l’IA à votre service)
  1. Modérateur
    Le code est complet ou il y a autre chose ?

    Que donne l'affichage suivant :
    System.out.println(System.in);
    System.out.println(sc);
    1. Bonsoir,

      Merci de m'aider !

      Voici le code complet de la méthode appelée :

      public void run() {
      
      		System.out.println("Bienvenue dans l'Application");
      		Scanner sc = new Scanner(System.in);
      		System.out.println("Veuillez saisir un nombre :");
      		int str = sc.nextInt();
      		System.out.println("Vous avez saisi le nombre : " + str);
      
      	
      	}
      
      
      
      1. Sinon avant exécution voici le résultat des System.out.println(System.in) et sc :
        [java] java.io.BufferedInputStream@649a8a68

        [java] java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\ ][decimal separator=\,][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Qâ^z\E]
      2. Je ne comprends pas car en créant une classe avec simplement un main et ces infos, çà passe bien ! Mais je dois vraiment utiliser cette méthode run.
      3. Modérateur
        C'est le run de la classe Thread ?
        Si tu lances plusieurs Thread en même temps je comprendrais que ça bug. Il faut que tu essayes avec un seul objet Scanner sur le clavier en mettant un bloc de synchronisation

        private static final Scanner sc = new Scanner(System.in);
        
        public void run()
        {
        	System.out.println("Bienvenue dans l'Application");
        	
        	synchronized(sc)
        	{
        		System.out.print("Veuillez saisir un nombre : ");
        		int str = sc.nextInt();
        		System.out.println("Vous avez saisi le nombre : " + str);
        	}
        }
      4. J'ai juste une classe qui implémente Runnable mais je n'ai pas de thread.
      5. Modérateur
        Et comment tu utilises cette méthode ? Dans quel contexte tu l'appelles ?
        Est-ce que mon code change quelque chose à ton problème ?