2014-02-24 54 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」之類的東西,並閱讀其他一些問題的答案。 –

相關問題