2016-01-13 63 views
-1

我提前道歉;我無法在Search中找到這個簡單問題的答案。Java「while」循環 - 計數匹配Algo - 賦值必須發生在while循環內

我是編碼的新手。目前Udacity正在通過Java Intro入門課程。

有些東西我不理解,因爲它涉及某些算法。例如

以「計數匹配」算法爲例。

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

因爲如果Scanner已經確定了下一個標記可以解析爲雙in.nextDouble()才能使用。除了等待用戶輸入外,這是hasNextDouble()爲您保證的。如果你把它從循環中取出,你不僅跳過了這個保證(並且不給用戶一個輸入任何東西的機會),你也一次只運行nextDouble(),所以你不會有最新的值。

如果使用nextDouble()方法將此掃描器輸入中的下一個標記解釋爲double值,則返回true。掃描儀不會超過任何輸入。

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

+0

你是不是認爲'hasNextDouble()'永遠不會是錯誤的? – SomeJavaGuy

+0

@KevinEsche是啊,也考慮到'掃描儀'的工作方式,答案是無論如何都有誤導 – Matt

0

因爲你不容做任何進一步的輸入,當你移動它的外循環條件的循環in.hasNextDouble()將百達是真實的。之後,你將陷入一個無限循環,這使得程序就像它的布朗一樣,但實際上它只是重複循環和打印,直到你自己停止java進程。

0

你說得對,當值存儲在一個變量中時,java不應該(也不會)關心它,但是這個值更多。 in.hasNextDouble()直到包裝輸入流中的行結束纔會返回。 它不會以任何方式改變流,但它確保有一個字符序列在流中等待,如果true可以解析爲double。在調用nextDouble()之前,緩衝區不會被改變。 這是破壞你的代碼。當你將緩衝區中的行從緩衝區中刪除時,如果它沒有被解析爲一個double,則拋出一個異常,因爲沒有字符在等待System.in