web-dev-qa-db-fra.com

Comment sortir de la boucle while en Java avec la méthode Scanner "hasNext" comme condition?

Je suis un débutant en programmation Java et j'ai rencontré un problème étrange. Ci-dessous se trouve mon code, qui demande à l’utilisateur une entrée et affiche ce qu’il entre un mot à la fois.

Le problème est que le programme ne se termine jamais, et d'après ma compréhension limitée, il semble être resté bloqué dans la boucle while. Quelqu'un pourrait-il m'aider un peu? Merci d'avance.

import Java.util.Scanner;

public class Test{
   public static void main(String args[]){
      System.out.print("Enter your sentence: ");
      Scanner sc = new Scanner (System.in);

      while (sc.hasNext() == true ) {
        String s1 = sc.next();
        System.out.println(s1);
      }

      System.out.println("The loop has been ended"); // This somehow never get printed.
   }
}
13
Synia

Vous continuez à obtenir une nouvelle chaîne et continuez la boucle si elle n'est pas vide. Insérez simplement un contrôle dans la boucle pour une chaîne de sortie.

while(!s1.equals("exit") && sc.hasNext()) {
    // operate
}

Si vous souhaitez déclarer la chaîne dans la boucle et ne pas effectuer les opérations dans le corps de la boucle si la chaîne est "exit":

while(sc.hasNext()) {
    String s1 = sc.next();
    if(s1.equals("exit")) {
        break;
    }
    //operate
}
15
İsmet Alkan

La Scanner continuera à lire jusqu'à trouver une condition de "fin de fichier".

Lorsque vous lisez stdin, ce sera soit lorsque vous envoyez un caractère EOF (généralement ^d sous Unix), soit à la fin du fichier si vous utilisez la redirection de style <.

8
Alnitak

Comme mentionné par Alnitak, lorsque vous utilisez scanner, vous obtenez uniquement 'false' pour hasNext () lorsque vous avez un caractère EOF, en gros ... Vous ne pouvez pas facilement envoyer et le caractère EOF à l'aide du clavier, Par conséquent, dans de telles situations, il est courant d'avoir un caractère spécial ou un mot que vous pouvez envoyer pour arrêter l'exécution, par exemple:

String s1 = sc.next();
if (s1.equals("exit")) {
    break;
}

La pause va vous sortir de la boucle.

3
Renato

Votre condition est correcte (bien que vous devriez abandonner le == true). Ce qui se passe, c'est que le scanner continuera à fonctionner jusqu'à la fin de la saisie. Essayer Ctrl+D, ou canaliser l'entrée à partir d'un fichier (Java myclass < input.txt).

1
Kevin

cela ne fonctionne pas parce que vous n'avez pas programmé de sécurité intégrée dans le code. Java voit que le scanner peut toujours collecter des entrées tant qu'il est possible de les collecter. Si cela est possible, il continue de le faire. avoir un test de scanner pour voir si un certain mot, tel que EXIT par exemple, va bien, mais vous pouvez aussi le laisser boucler un certain nombre de fois, une dizaine à peu près. mais l'approche la plus efficace consiste à demander à l'utilisateur de votre programme le nombre de chaînes qu'il souhaite entrer et, bien que le nombre de chaînes qu'il entre soit inférieur au nombre entré, le programme s'exécutera. une option supplémentaire pourrait être si ils tapez EXIT, quand ils voient qu'ils ont besoin de moins d'espaces qu'ils n'en ont mis et qu'ils ne veulent pas remplir les cellules suivantes avec rien d'autre que des espaces. et vous pourriez demander au programme s'il souhaite entrer plus de données, s'il se rend compte qu'il doit entrer plus de données dans l'ordinateur ... le programme serait assez simpliste, mais il existe de nombreuses façons vous pourriez le faire. n'hésitez pas à me demander ces façons, je manque de place. XD

1
Thomas

Si vous ne souhaitez pas utiliser de caractère EOF pour cela, vous pouvez utiliser StringTokenizer:

import Java.util.*;
public class Test{
   public static void main(){
      Scanner sc = new Scanner (System.in);
      System.out.print("Enter your sentence: ");
      String s=sc.nextLine();
      StringTokenizer st=new StringTokenizer(s," ");//" " is the delimiter here.
      while (st.hasMoreTokens() ) {
        String s1 = st.nextToken();
        System.out.println(s1);
      }

      System.out.println("The loop has been ended");
   }
}
1
Zia Ansari

Vous pouvez simplement utiliser l'un des indicateurs de fin de fichier dépendants du système (d pour Unix/Linux/Ubuntu, z pour Windows) pour rendre l'instruction while fausse. Cela devrait vous sortir de la boucle bien. :)

0
TOLU

J'ai eu le même problème et je l'ai résolu en lisant toute la ligne de la console avec un objet scanner, puis en analysant la chaîne résultante à l'aide d'un second objet scanner. 

Scanner console = new Scanner(System.in);
System.out.println("Enter input here:");
String inputLine = console.nextLine();

Scanner input = new Scanner(inputLine);
List<String> arg = new ArrayList<>();

while (input.hasNext()) {
    arg.add(input.next().toLowerCase());
}
0
Skandalos