我是编码的新手。目前,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.");
}
}
答案 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