如何使用Scanner方法“hasNext”作为条件退出java中的while循环?

问题描述 投票:14回答:9

我是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.
   }
}
java loops while-loop infinite-loop
9个回答
17
投票

你继续获得一个新的字符串并继续循环,如果它不是空的。只需在循环中插入一个控件以获取退出字符串。

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

如果你想在循环中声明字符串而不是在循环体中执行操作,如果字符串是“exit”:

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

8
投票

Scanner将继续阅读,直到找到“文件结束”条件。

正如你在stdin上读到的那样,那就是当你发送一个EOF字符(通常是Unix上的^d)时,或者如果你使用<样式重定向那么发送到文件的末尾。


4
投票

当你使用扫描仪时,正如Alnitak所提到的,当你有一个EOF角色时,你只能得到'false'的hasNext(),基本上...你不能轻易地使用键盘发送和EOF角色,因此在这种情况下,它是常见的有一个特殊的字符或单词,你可以发送它来停止执行,例如:

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

休息会让你离开循环。


2
投票

你的情况是对的(虽然你应该放弃== true)。发生的事情是扫描仪将继续运行,直到它到达输入的末尾。尝试Ctrl + D,或管道文件(java myclass < input.txt)的输入。


1
投票

它不起作用,因为您没有在代码中编写故障安全程序。 java看到扫描程序仍然可以收集输入,同时有收集的输入,如果可能的话,虽然这是真的,但它仍然这样做。有一个扫描仪测试,以查看某个单词,例如EXIT是否正常,但你也可以让它循环一定次数,如十个左右。但最有效的方法是向程序的用户询问他们希望输入多少个字符串,并且当他们输入的字符串数量少于他们输入的数字时,程序将执行。一个附加的选项可能是,如果他们输入EXIT,当他们看到他们需要的空间少于他们输入的空间,并且不想用空白填充下一个单元格。并且您可以让程序询问是否要输入更多输入,以防他们意识到需要在计算机中输入更多数据。这个程序非常简单,因为有一些方法可以做到。我可以随意问我这些方法,但是我已经没空了。 XD


1
投票

如果您不想为此使用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");
   }
}

0
投票

您可以简单地使用系统相关的文件结束指示符之一(d代表Unix / Linux / Ubuntu,z代表Windows)使while语句为false。这应该让你很好地摆脱循环。 :)


0
投票

我遇到了同样的问题,我通过使用一个扫描仪对象从控制台读取整行来解决它,然后使用第二个扫描仪对象解析生成的字符串。

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());
}

-3
投票

修改while循环,如下所示。将s1声明为String s1;一次在循环之外。要结束循环,只需使用ctrl + z即可。

  while (sc.hasNext())
  {    
    s1 = sc.next();
    System.out.println(s1);
    System.out.print("Enter your sentence: ");
  }
© www.soinside.com 2019 - 2024. All rights reserved.