2012-03-19 107 views
2

我正在爲我的家庭作業創建一副卡片。代碼如下。我需要創建
四套牌(四套),並創建一個多維數組。當我打印結果而不是嘗試傳遞數組時,我可以看到數組中的數據與預期的一樣。但是,當我嘗試通過card陣列時,出現錯誤cannot find symbol。我已經在texbook和Java教程示例之後建立了這個模型,我需要一些幫助來確定我錯過了什麼。我已經記錄了一些想法,讓我知道我應該如何工作......請讓我知道我的理解中哪裏出了可怕的錯誤。如何從方法返回數組?

import java.util.*; 
import java.lang.*; 
// 
public class CardGame 
{ 
    public static int[][] main(String[] args) 
    { 
     int[][] startDeck = deckOfCards(); /* cast new deck as int[][], calling method deckOfCards 
     System.out.println(" /// from array: " + Arrays.deepToString(startDeck)); 
    } 

    public static int[][] deckOfCards() /* method to return a multi-dimensional array */ 
    { 
     int rank; 
     int suit; 
     for(rank=1;rank<14;rank++) /* cards 1 - 13 .... */ 
     { 
      for(suit=1;suit<5;suit++) /* suits 1 - 4 .... */ 
      { 
       int[][] card = new int[][] /* define a new card... */ 
       { 
        {rank,suit}  /* with rank/suit from for... loops */ 
       }; 
       System.out.println(" /// from array: " + Arrays.deepToString(card)); 
      } 
     } 
     return card; /* Error: cannot find symbol 
    } 
} 
+0

您正在定義'card [] []'在您的嵌套循環內,因此它只在它的(outer for循環)範圍內可見。 – 2012-03-19 23:25:24

回答

2

啊......範圍是你的問題......看卡片是在哪裏申報的,它是從哪裏返回的。記住,當你在一個循環或子函數中聲明一個變量時,它的作用域被限制在堆棧上的那個位置。如果這不能幫助我回復。

+0

我得到範圍的想法,看着我的代碼,看看爲什麼'卡'只限於那個{}塊。現在的問題是我是否在其他地方移動了'int card [] []'行,或者如果我在主方法(例如全局變量)之前放置了'int card [] [];'並創建'card = new deckOfCards ();'它在哪裏?我在正確的軌道上嗎? – dwwilson66 2012-03-19 23:47:00

+0

正確的軌道完全取決於你想要發生的事情。如果你在for循環之外實例化整個數組,你永遠不會意外返回null。如果你不這樣做,那麼當循環從不輸入時你可能會返回null。 (這種情況不會發生在你的情況下,我不相信)但是,如果你現在將卡陣列實例化,每次迭代到一個新的數組槽時,你都會覆蓋舊的對象並丟失這些信息。最好的答案是在四個循環之外聲明整個事物並且實例化它。 – 2012-03-19 23:52:10

+0

我會在接下來的8小時後發佈我的代碼,但是我最終宣佈將卡片作爲全球...在主要方法之外,並且它像夢一樣運行!謝謝你的幫助! – dwwilson66 2012-03-20 00:02:12

4

cardfor循環中存在:變量是僅在它們所聲明的塊({..})內有效。

注意規則的main()方法(從部分12.1.4調用Test.mainJLS 3.0):

的方法主要必須聲明爲public,static和無效的。它必須接受 單個參數,它是一個字符串數組。

1

參考卡僅限於內循環的範圍。一個變量只存在於包含它的最內圈套{}的內部。

你想在循環外創建一個數組,並將其填充到循環中。不要爲循環的每個循環創建一個全新的數組。

1

您的卡在for循環中定義。試着在頂部定義它,否則它會在每個循環中重新定義,並且您的函數將返回空值。

import java.util.*; 
import java.lang.*; 
// 
public class CardGame 
{ 
    public static int[][] main(String[] args) 
    { 
     int[][] startDeck = deckOfCards(); /* cast new deck as int[][], calling method deckOfCards 
     System.out.println(" /// from array: " + Arrays.deepToString(startDeck)); 
    } 

    public static int[][] deckOfCards() /* method to return a multi-dimensional array */ 
    { 
     int rank; 
     int suit; 
     int[][] card = new int[][] /* define a new card... */ 
     for(rank=1;rank<14;rank++) /* cards 1 - 13 .... */ 
     { 
      for(suit=1;suit<5;suit++) /* suits 1 - 4 .... */ 
      { 

       { 
        {rank,suit}  /* with rank/suit from for... loops */ 
       }; 
       System.out.println(" /// from array: " + Arrays.deepToString(card)); 
      } 
     } 
     return card; /* Error: cannot find symbol 
    } 
} 
0

感謝大家指出範圍是我的問題......這是絕對的。這是我修改後的代碼,我很高興能非常好地報告這些作品。

import java.util.*; 
import java.lang.*; 
// 
public class CardGame 
{ 
    static int card[][]; /* card is now a global variable...and static so it can */ 
          /* interact with static methods. */ 
// 
    public static void main(String[] args) 
    { 
     int card[][]; 
     int[][] startDeck = deckOfCards(); 
     System.out.println(" /// from array: " + Arrays.deepToString(startDeck)); 
    } 


    public static int[][] deckOfCards() 
    { 
     int rank; 
     int suit; 
     for(rank=1;rank<14;rank++) 
     { 
      for(suit=1;suit<5;suit++) 
      { 
       card = new int[][] 
       { 
        {rank,suit} 
       }; 
       System.out.println(" /// from array: " + Arrays.deepToString(card)); 
      } 
     } 
     return card; 
    } 
}