2012-03-19 81 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; 
    } 
}