22

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

9 回答 9

24

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

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

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

while(sc.hasNext()) {
    String s1 = sc.next();
    if(s1.equals("exit")) {
        break;
    }
    //operate
}
于 2012-05-07T23:11:47.373 回答
11

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

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

于 2012-05-07T23:11:05.860 回答
5

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

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

Break 会让你跳出循环。

于 2012-05-07T23:16:50.307 回答
3

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

于 2012-05-07T23:16:04.187 回答
2

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

于 2013-02-17T04:27:28.540 回答
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");
   }
}
于 2014-10-17T17:52:16.780 回答
1

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

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());
}
于 2018-11-05T11:53:39.267 回答
0

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

于 2014-09-30T00:41:40.567 回答
-3

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

  while (sc.hasNext())
  {    
    s1 = sc.next();
    System.out.println(s1);
    System.out.print("Enter your sentence: ");
  }
于 2013-02-19T05:53:27.890 回答