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

时间:2012-05-07 23:08:23

标签: java loops while-loop infinite-loop

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

9 个答案:

答案 0 :(得分:17)

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

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

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

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

答案 1 :(得分:8)

Scanner将继续读取,直到找到“文件结束”状态。

当你从stdin读取时,那就是你发送一个EOF字符(通常是Unix上的^d),或者当你使用{{1样式重定向。

答案 2 :(得分:4)

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

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

休息会让你离开循环。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分: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");
   }
}

答案 6 :(得分:0)

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

答案 7 :(得分: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());
}

答案 8 :(得分:-3)

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

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