2014-02-24 29 views
3

我对Java非常陌生(完全是编程)。我相信解决我的问题非常简单,但我无法弄清楚。下面的代码是我的程序的一小部分。但它仍然是可编译的,并且仍然存在相同的问题。我怎样才能使这个陈述(在一个while循环内)不打印两次到控制台?

下面是代码::

import java.util.Scanner; 

public class Practice{ 
    public static void main(String args[]){ 

     Scanner input = new Scanner(System.in); 

     String command = ""; 

     double d; // Distance 
     double t; // Time 
     double s; // Speed 

     System.out.println("Hello, I am the Physics Calculator!!"); 

     while (!command.equals("end")){ 

      System.out.print("What would you like to calculate?: "); // after the first loop, this statement is printed twice to the screen! :(
      command = input.nextLine(); 
      System.out.println(); 

      if (command.equals("speed")){ 

       System.out.print("What is the distance in meters?: "); 
       d = input.nextDouble(); 

       System.out.print("What is the time is seconds?: "); 
       t = input.nextDouble(); 

       s = d/t; 

       System.out.println("The Speed is "+ s +" m/s"); 
       System.out.println(); 

      } 
     } //End of the while-loop 
    } 
} 

的代码的while循环中的第一行是:

System.out.println("What would you like to calculate?: "); 

到目前为止好。当我运行该程序时,它会打印:* 您要计算什么?:* 然后程序按预期继续。

问题出在程序到达while循环的末尾之后,并返回到while循环的顶部。它会打印:

你想做些什么?:计算
你想做些什么?:计算

我只是想不通为什么它打印出来两次。

这里是运行程序时,我收到确切的输出的例子(斜体是输出到控制台和大胆是我输入):

开始{

你好,我是物理计算器!
你想什么来计算?:速度

什么是什么时间?:米50
的距离秒?:
速度为1.0m/S

你想做些什么?:计算
你想什么来计算?:
}结束

最后,我还是可以输入“速度”,并继续与该程序。我只想摆脱第二个'你想要计算什么'。

关于我遇到的问题的任何输入将受到高度赞赏!

非常感谢为您的时间!

+2

请考虑的Java编码约定。命名你应该使用'input'而不是'Input'和'command'而不是'Command'。 –

+0

谢谢恩!我对Java的编码约定做了一些研究,你是对的!我没有遵循惯例,所以我编辑了我的帖子(和我的程序),并纠正了我的错误。再次感谢! – JavaSufferer

回答

4

这是因为nextDouble不消耗后面的数字换行符。你需要分开做。目前,该换行符(数字之后)在下次系统提示您输入命令时消耗。由于空字符串不是"speed",循环会经历一次额外的时间。

t = Input.nextDouble();后添加Input.nextLine();,这会工作得很好。

+0

谢谢大卫!当我按你的建议做时,它解决了问题!虽然我不得不承认,但我不明白为什么要添加'Input.nextLine();'解决了这个问题。但是我对编程非常陌生,(只有两个星期),我相信当我学到更多东西的时候,我会弄明白的。再次感谢!! – JavaSufferer

+0

@JavaSufferer当您按下“Enter”键提交,它的类型的新行字符到System.in。当你调用nextDouble,扫描仪读取是发现在输入下一个数字字符串中的字符的一些量,留下别的剩。调用nextLine读取流中的下一行,在这种情况下,这只是nextDouble未读取的最后一个条目中的新行字符。这只是Scanner和System.in之间的一种奇怪的交互。 – Radiodef

+0

是,@Radiodef,这是表达它的一个好办法。有本网站关于此完全相同的问题很多,很多问题 - 使用'nextLine',要么'nextInt'或'nextDouble'在同'Scanner'使用程序。不幸的是,如果你不知道这是什么问题,很难知道要搜索什么。 JavaSufferer,我建议快速搜索“Scanner nextLine”之类的东西,并阅读其他一些问题的答案。 –

相关问题