Как выйти из цикла while в java с помощью метода сканера "hasNext" в качестве условия?

Я новичок в Java-программировании и столкнулся со странной проблемой. Ниже приведен мой код, который запрашивает пользователя для ввода и распечатывает то, что пользователь вводит по одному слову за раз.

проблема в том, что программа никогда не заканчивается, и из моего ограниченного понимания, похоже, она застряла внутри цикла while. Кто-нибудь может мне немного помочь? Спасибо заранее.

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.
   }
}

8 ответов


вы продолжаете получать новую строку и продолжаете цикл, если он не пуст. Просто вставьте в петли на строку выход.

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

Если вы хотите объявить строку внутри цикла и не выполнять операции в теле цикла, если строка "exit":

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

на Scanner будет продолжать читать, пока не найдет условие "конец файла".

как Вы читаете stdin, это будет либо при отправке символа EOF (обычно ^d в UNIX), или в конце файла, если вы используете < перенаправление стиль.


когда вы используете сканер, как упоминалось в Alnitak, вы получаете "false" только для hasNext (), когда у вас есть символ EOF... Вы не можете легко отправить и EOF символ с помощью клавиатуры, поэтому в таких ситуациях, как это, это обычно иметь специальный символ или слово, которое вы можете отправить, чтобы остановить выполнение, например:

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

перерыв вытащит вас из петли.


ваше состояние правильное (хотя вы должны отбросить == true). Происходит то, что сканер будет продолжать работать, пока не достигнет конца ввода. Попробуй!--3-->Ctrl+D, или передать входные данные из файла (java myclass < input.txt).


Это не работает, потому что вы не запрограммировали отказоустойчивость в коде. java видит, что сканер все еще может собирать входные данные, пока есть вход, который нужно собрать, и, если это возможно, хотя это правда, он продолжает это делать. наличие теста сканера, чтобы увидеть, если определенное слово, например EXIT, хорошо, но вы также можете иметь его цикл определенное количество раз, например, десять или около того. но самый эффективный подход-спросить пользователя вашей программы, сколько строк они хотят ввести, и пока количество строк, которые они вводят, меньше числа, которое они вводят, программа должна выполнить. дополнительный вариант может быть, если они набирают EXIT, когда они видят, что им нужно меньше пробелов, чем они вставляют, и не хотят заполнять следующие ячейки ничем, кроме пробелов. и вы можете попросить программу спросить, хотят ли они ввести больше данных, если они понимают, что им нужно ввести больше данных в компьютер. программа будет довольно упрощенной, а также потому, что есть множество способов, которыми вы можем сделать это. не стесняйтесь спрашивать меня об этих способах, у меня заканчивается комната. XD


Если вы не хотите использовать символ EOF для этого, вы можете использовать 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");
   }
}

вы можете просто использовать один из системных зависимых индикаторов конца файла (d для Unix/Linux/Ubuntu, z для windows), чтобы сделать оператор while ложным. Это должно вывести тебя из петли. :)


изменить цикл while, как показано ниже. Объявите s1 как строку s1; один раз вне цикла. Чтобы завершить цикл, просто используйте ctrl+z.

  while (sc.hasNext())
  {    
    s1 = sc.next();
    System.out.println(s1);
    System.out.print("Enter your sentence: ");
  }