繁体   English   中英

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

[英]How to get out of while loop in java with Scanner method "hasNext" as condition?

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

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

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

如果要在循环内声明字符串,并且如果字符串为“exit”,则不执行循环体中的操作:

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

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

当您从stdin读取时,这将是您发送 EOF 字符(在 Unix 上通常为^d )时,或者是在文件末尾(如果您使用<样式重定向)。

当您使用扫描仪时,如 Alnitak 所提到的,当您有 EOF 字符时,您只会得到 hasNext() 的“false”,基本上……您无法使用键盘轻松发送 EOF 字符,因此在这种情况下,这是很常见的具有可以发送以停止执行的特殊字符或单词,例如:

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

Break 会让你摆脱困境。

您的条件是正确的(尽管您应该删除== true )。 发生的事情是扫描器将继续运行,直到到达输入的末尾。 尝试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");
   }
}

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

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

您可以简单地使用依赖于系统的文件结束指示符之一(对于 Unix/Linux/Ubuntu 为 d,对于 Windows 为 z)使 while 语句为假。 这应该能让你很好地摆脱困境。 :)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM