2013-10-15 54 views
1

嘿,我是新來的節目和正在探索的Java與Eclipse聲明。我正在嘗試製作一個簡單的程序,在該程序中我可以輸入骰子有多少面,以及我想要使用多少面。 for語句雖然給我帶來麻煩。對於沒有工作

這裏是我有什麼。

{ 
    public static void main(String[] args) 
    { 
     Random generator = new Random(); 
     int sides; 
     int num; 
     int rolls; 
     Scanner scan = new Scanner(System.in); 
     while (sides != 0); 
     { 

     System.out.println("How many sides does your dice have?(0 to quit)"); 
     sides = scan.nextInt(); 

     System.out.println("How many dice would you like to roll?"); 
     rolls = scan.nextInt(); 

     for (int num1 : rolls); 
      { 

         num = generator.nextInt(sides); 
       System.out.println("You rolled a " + num); 
      } 
     } 
    } 
} 

for語句說,當我將鼠標懸停在「滾動」,它「只能遍歷數組或java.lang.Iterable的實例」。幫助將不勝感激。

+2

在'for'循環聲明中'''後面取掉''''。 –

+0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html – chrylis

+0

此外,你不讀任何東西到'sides'你'while'循環之前。 – chrylis

回答

1

你的程序有一個Java語法錯誤,爲此,編譯器會抱怨, 和一個更微妙的邏輯錯誤,這是相當常見即使在跨越整個C經驗 程序員/ C++/C#/ Java家族。

語法錯誤在於你使用的那種對於需要你指定的 冒號後的集合;或者,更確切地說,一個類型的對象,其 實現接口可迭代。接口定義了合同,它授權編譯器對實現接口的類的實例執行某些操作。因此,編譯器將處理過的迭代變量只有在 變量可迭代。由於你的情況類型爲INT(因此 甚至不是一類)和INT的Iterable,你的錯誤。

上使用 經典 ,它支持幾乎與 在C,C++,C#和Java沒有區別整數

迭代

for (int num1 = 0; num1 < rolls; num1 = num1 + 1) 
    /* A single statement (body) */; 

這意味着聲明:重複,即的(...)後提到說法,正是倍。更準確地說,它實現了以下算法:

A. Initialize num1 to 0 
B. Is num1 lesser than rolls? 
    If yes, execute the body, increment num1 and go back to B 
    If not, go to the first instruction after the **for** 

現在,第二個問題;這可能與的口味都發生,但它是不可能被忽視與可迭代味道。你很可能不希望之後的聲明中有分號;這是爲什麼。對於C語言和類C語言的所有語言(如Java)的設計決策是,在大多數要插入一個或多個語句的地方,實際上只能插入一條語句。該循環可以在它的身上只能處理一條指令,並且這將是一前一後,不顧縮進和編碼風格。考慮以下對循環:

// Prints numbers from 0 to 9 
int x = 0; 
for (x = 0; x < 10; x = x + 1) 
    System.out.println(x); 

// Prints 10 
int y = 0; 
for (y = 0; y < 10; y = y + 1); 
    System.out.println(y); 

他們看起來一樣,但第一代碼片段的效果是從0打印至9的數字,而第二個效果是印刷10的原因是第二個主體實際上是一個空的陳述。你可以重寫兩個* * S這樣的:

int x = 0; 
for (x = 0; x < 10; x = x + 1) 
    System.out.println(x); 

int y = 0; 
for (y = 0; y < 10; y = y + 1) 
    /* Lalala... does nothing at all... */; 
System.out.println(y); // When control flow gets here, y equals 10 

要放多語句內爲,則必須使用,這是一個許多語句組成的語句。對於初學者來說有什麼誤導的是,塊不需要與關聯,並且實際上可以自己存在。在Java中,下面的代碼是合法的:

 { 
      num = generator.nextInt(sides); 
      System.out.println("You rolled a " + num); 
     } 

當你把一個其中錯誤地包括在最後的分號:

 for (int num1 = 0; num1 < rolls; num1 = num1 + 1); 
     { 
      num = generator.nextInt(sides); 
      System.out.println("You rolled a " + num); 
     } 

你基本上是說:

 for (int num1 = 0; num1 < rolls; num1 = num1 + 1) 
      /* Lalala... does nothing at all... */; 
     { 
      num = generator.nextInt(sides); 
      System.out.println("You rolled a " + num); 
     } 

因此,你的執行沒有什麼正好次,然後它執行一次塊語句。有時候,這些錯誤是由事實緩和,一個的身體會引用迭代變量,NUM1,但它不是你的情況。考慮:

for (int num1 = 0; num1 < rolls; num1 = num1 + 1); 
    { 
     Console.out.println("Roll No. " + num1); 
     num = generator.nextInt(sides); 
     System.out.println("You rolled a " + num); 
    } 

這有;問題,但編譯器檢測到有問題,因爲您在塊語句中使用num1,但由於;塊語句未與相關聯,並且因此NUM1超出範圍。以下,雖然具有相同的邏輯錯誤,不會導致一個編譯器錯誤:

for (int num1 = 0; num1 < rolls; num1 = num1 + 1); 
    { 
     num = generator.nextInt(sides); 
     System.out.println("You rolled a " + num); 
    } 

注意:也是你有額外的類似的問題;字符。

2

Java中的for (<type> <name> : <collection>)預計收錄在冒號:的右側。如果你想通過一個整數範圍,使用不同形式的for

for (int num1 = 0 ; num1 < rolls ; num1++) { 
    ... 
} 
0

一個for循環在Java中傳統採用的for (initialization; termination; increment)形式。中加入for-each快捷方式(相對)最近,並且用於允許通過的Iterable和數組實現更簡單的循環。

使用try ....

for (int num1 = 0; num1 < rolls; num1++) {...} 

...相反。

採取在The for statement細看了解更多詳情

0

你想

for (int num1 = 0; num1 < rolls; num1++) 

(後無分號)。

有for循環2種,基於範圍在陣列和iterables和標準的,在那裏你給它一個初始化,是否保留去的條件,有事每個循環後做。這三部分之間用分號隔開,就像我上面所做的那樣。

0

您遇到的問題是當您打算使用for循環時,您基本上試圖執行foreach。當您使用您正在使用for(T x : Collection<T>)請注意,您在聲明一個變量int num1,然後試圖遍歷另一個號碼rolls的符號。這隻能用於遍歷集合,而不能用於創建標準循環。相反,你應該使用標準for循環:

for (int x = 0; x < rolls; x++); 
{ 

    num = generator.nextInt(sides); 
    System.out.println("You rolled a " + num); 
}