循环终止

时间:2014-07-08 02:01:11

标签: java while-loop

如果我注释掉garbage = scan.nextLine();行,则while循环无限运行。否则,它没有。我理解为什么如果只有print命令它会无限运行,但我不完全理解包含garbage变量如何阻止它无法运行。有人可以解释一下吗?

 import java.util.Scanner;

 public class TypeSafeReadInteger
 {
     public static void main(String [] args)
     {
         Scanner scan = new Scanner(System.in);
         String garbage;

         System.out.print("Enter age as an integer > ");

         while (! scan.hasNextInt())
         {
             garbage = scan.nextLine();
             System.out.print("\nPlease enter an integer > ");
         }

         int age = scan.nextInt();
         System.out.println("Your age is " + age);
     }
 }

4 个答案:

答案 0 :(得分:4)

garbage只是一个变量,它会停止' while循环是nextLine()这是一个等待用户输入的方法。在您的用户使用键盘输入内容并将输入保存到garbage变量之前,while不会继续。

答案 1 :(得分:2)

你需要知道两件事:

  • hasNextLine() 推进扫描程序实例。
  • nextLine() 推进扫描程序实例。

通过"推进扫描仪实例",我的意思是"消费"输入。将输入视为流,并将扫描器对象视为消耗该流的内容。

普通流中的内容只能使用一次。您在名为garbage的变量中捕获了您的内容,但您可以轻松调用scan.nextLine()而不存储结果。我强烈建议您阅读Javadoc on Scanner以查看哪些方法推进了扫描仪实例,哪些方法没有。

答案 2 :(得分:0)

修复您的代码:

    while (!scan.hasNextInt())
    {
        scan.nextLine(); // the order of the lines inside the loop makes the difference!
        System.out.print("\nPlease enter an integer > ");
        // when you perform nextLine() here - you reach the beginning of the loop 
        // without a token in the scanner - so you end up looping forever
    }
    int age = scan.nextInt();

顺便说一下 - 正如您从上面的示例中看到的那样,garbage是多余的。

答案 3 :(得分:0)

如果用户输入一个整数,那么一切正常。如果他们不这样做,那么由于Scanner类的工作方式,你会得到没有garbage = scan.nextLine();行的无限循环。

当您执行scan.hasNextInt();之类的操作时,实际上不会从输入中读取任何字符。因此,如果用户输入类似“cat”的内容以响应您的提示,则输入将在该单词的第一个字母之前暂停。由于您在循环中直到输入中存在整数,因此不会进一步读取并且您将无限循环,因为“cat”只是位于输入缓冲区中。

通过添加scan.nextLine(),您将导致扫描程序放弃用户点击< enter>时的所有内容。并且可以处理其他输入。