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

Posted

技术标签:

【中文标题】java - 如何使用Scanner方法“hasNext”作为条件退出java中的while循环?【英文标题】:How to get out of while loop in java with Scanner method "hasNext" as condition? 【发布时间】:2012-05-16 10:46:02 【问题描述】:

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

【问题讨论】:

(offtopic) 通常只写while (sc.hasNext()) 而不是while (sc.hasNext() == true)hasNext() 已经返回一个布尔值。 【参考方案1】:

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

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

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

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

【讨论】:

这很好,但前提是您在循环之外声明字符串(这可能不是很理想)并且即使您获得字符串“exit”也想执行循环体,如您只是在执行主体后检查此条件,这几乎总是不是您想要的。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

当您使用扫描仪时,如 Alnitak 所述,只有当您有 EOF 字符时,hasNext() 才会得到“假”,基本上......您不能使用键盘轻松发送 EOF 字符,因此在这样的情况下,通常会有一个特殊字符或单词,您可以发送它来停止执行,例如:

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

Break 会让你跳出循环。

【讨论】:

"你不能轻易地使用键盘发送 EOF 字符" -- 通常在 Linux/Unix/Mac 上使用 Ctrl+D 或在 Windows 上使用 Ctrl+Z。 谢谢,但是特定于操作系统的知识通常不能很好地与 Java 混合......因此评论。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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】:

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

以上是关于java - 如何使用Scanner方法“hasNext”作为条件退出java中的while循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 流中模拟 Java Scanner 的 next() 方法?

Java中Scanner类的使用

Java中Scanner类的使用

java中如何使用scanner来实现数据的输入?

如何使用JDK提供的帮助文档

java如何使用帮助文档api