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

m0rkklqb  于 2022-12-25  发布在  Java
关注(0)|答案(9)|浏览(228)

我遇到了一个问题。下面是我的代码,它要求用户输入并打印出用户一次输入一个单词的内容。
问题是这个程序永远不会结束,而且从我有限的理解来看,它似乎卡在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.
   }
}
xwmevbvl

xwmevbvl1#

你不断地得到新的字符串,如果它不为空,就继续循环。简单地在循环中插入一个退出字符串的控件。

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

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

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

iq0todco2#

Scanner将继续读取,直到找到“文件结束”条件。
当您从stdin阅读时,这将是当您发送一个EOF字符(通常是Unix上的^d)时,或者如果您使用<样式重定向,则是在文件的末尾。

bvjveswy

bvjveswy3#

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

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

休息会让你脱离这个圈子。

s4n0splo

s4n0splo4#

您的条件是正确的(尽管您应该删除== true)。问题是扫描程序将继续运行,直到到达输入的末尾。请尝试Ctrl+D,或从文件(java myclass < input.txt)中通过管道输入。

ttisahbt

ttisahbt5#

它不工作是因为你没有在代码中编程一个故障保护。java看到扫描器仍然可以收集输入,而有输入要收集,如果可能,而这是真的,它继续这样做。有一个扫描器测试,看看是否某个词,如退出,是好的,但你也可以让它循环一定的次数,比如10个左右。2但是最有效的方法是询问你的程序的用户他们希望输入多少字符串,当他们输入的字符串数小于他们输入的字符串数时,程序将执行。3一个附加的选项可以是如果他们键入EXIT,当他们发现他们需要的空间比他们输入的少,并且不想用空白来填充下一个单元格时。你可以让程序询问他们是否想输入更多的输入,以防他们意识到他们需要向计算机输入更多的数据。该程序制作起来会相当简单,也因为有很多方法你可以做到这一点。随时问我这些方法,我运行的空间虽然。XD

yrefmtwq

yrefmtwq6#

如果你不想使用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");
   }
}
wz8daaqr

wz8daaqr7#

我遇到了同样的问题,我通过使用一个scanner对象从控制台阅读整行,然后使用第二个scanner对象解析得到的字符串来解决这个问题。

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

qvsjd97n8#

你可以简单地使用一个依赖于系统的文件结束指示符(d代表Unix/Linux/Ubuntu,z代表windows)来使while语句为false,这会让你很好地退出循环。

dgiusagp

dgiusagp9#

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

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

相关问题