Java“While”循环 - 计数匹配Algo - 分配值必须在while循环内发生

时间:2016-01-13 13:04:49

标签: java while-loop

我提前道歉;我在搜索中找不到这个简单问题的答案。

我是编码的新手。目前,Udacity正在通过Java编程入门课程。

有些东西我不理解,因为它与某些算法有关。

以“计算匹配”算法为例。

double input = in.nextDouble();需要在while循环中发生。

如果我将它放在while循环上方,它会破坏程序。为什么呢?

在我看来,当值存储在变量中时,Java不应该关心。

import java.util.Scanner;

public class CountingMatches
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        int counter = 0;

        System.out.print("Enter a value, Q to quit: ");    

        // double input = in.nextDouble(); // remember to place the assignment of this variable inside the while loop.
                                            // I tend to want to place this outside the while loop because I still don't     
                                            // understand why it necessarily must occur inside the while loop.

        while (in.hasNextDouble())
        {

            double input = in.nextDouble(); // this assignment is properly located here as opposed to just above the while-loop

            if (input < 0)
             {
                 counter++;
             }

            System.out.print("Enter a value, Q to quit: ");
        }

        System.out.println("The water line fell on " + counter + " years.");
    }
}

3 个答案:

答案 0 :(得分:3)

因为只有在in.nextDouble()已经确认后才能使用Scanner,所以下一个令牌可以解析为double。除了等待用户输入之外,这是hasNextDouble()为您保证的。如果你把它从循环中取出,你不仅要跳过hasNextDouble()保证(并且不给用户输入任何东西的机会),你也只运行nextDouble()一次,所以你不会#39; t无论如何都有最新价值。

  

如果使用nextDouble()方法可以将此扫描程序输入中的下一个标记解释为double值,则返回true。扫描仪不会超过任何输入。

- https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#hasNextDouble--

答案 1 :(得分:0)

因为当你将它移到循环之外时你不能再做任何输入,所以循环in.hasNextDouble()的条件总是如此。之后你将陷入一个无限循环,这使得程序就像是brocken,但实际上它只是重复循环和打印,直到你自己停止java进程。

答案 2 :(得分:0)

当你将值存储在一个变量中时,java不应该关心(并且不会),但是还有更多内容。 in.hasNextDouble()在包装的输入流内的行结束之前不会返回。 它不会以任何方式改变流,但它保证在流中等待一个字符序列,如果为true,则可以将其解析为double。在调用nextDouble()之前,不会更改缓冲区。 这就是破坏你的代码的原因。当您从缓冲区中删除该行而不将其解析为double时,将抛出异常,因为System.in

中没有任何字符在等待