使用'for'循环时出现'无法找到符号'错误

时间:2012-05-04 18:36:51

标签: java

我是Java的初学者,我很难理解如何在类和方法之间传递对象。我已经取得了一些进展,但是当我尝试在for循环中创建扑克牌时,我的应用程序现在失败了。如果我删除循环它工作正常。以下是包含错误的类的第一部分:

public class Testing
{
    public static void main(String[] args)
    {

   int Deal = 1;

   for(int Hand = 0; Hand < Deal; ++Hand)
   {
     //instantiate and derive values for Player
     Card card1 = new Card();
     card1.setSuit();  //assign card 1's suit
     card1.setValue(); //asign card 1's value

     //instantiate and derive values for Computer
     Card card2 = new Card();
     card2.setSuit();  //assign card 2's suit
     card2.setValue(); //assign card 2's suit

     //compare the two cards and make sure they are different
     cardCompare(card1,card2);
   }

   //output the two cards to the screen
   output(card1,card2);

}

这是我得到的错误:

Testing.java:26: error: cannot find symbol
   output(card1,card2);
          ^
  symbol:   variable card1
  location: class Testing

Testing.java:26: error: cannot find symbol
   output(card1,card2);
                ^
  symbol:   variable card2
  location: class Testing
2 errors

由于代码有效,如果我删除for循环,我假设某些名称card1和card2在循环外不可见?如果我想创建10或20张卡片,我想在循环中执行此操作,因此我必须遗漏一些关于实例化新对象并在程序中的其他位置使用它们的内容。

感谢您的帮助。

**更新:感谢您的初步反馈。我现在看到,如果我将实例化语句移到for循环之外,理论上我可以使用循环一遍又一遍地为这些对象分配新值,这就是我完成这个特定任务所需要的全部内容。

我仍然很好奇,是不是可以在循环中实例化新对象,但仍然在循环外使用它们?看起来这一定是可能的。

public class Testing
   {
    public static void main(String[] args)
   {

int Deal = 1;

   //instantiate and derive values for Player
     Card card1 = new Card();

      //instantiate and derive values for Computer
     Card card2 = new Card();

   for(int Hand = 0; Hand < Deal; ++Hand)
   {
     card1.setSuit();  //assign card 1's suit
     card1.setValue(); //asign card 1's value

     card2.setSuit();  //assign card 2's suit
     card2.setValue(); //assign card 2's value

    //compare the two cards and make sure they are different
     cardCompare(card1,card2);
   }


   //output the two cards to the screen
   output(card1,card2);


}

3 个答案:

答案 0 :(得分:5)

card1和card变量在for循环中声明,因此只在循环内部可见。要在循环外部使用它,必须在循环之前声明它。请阅读Java 范围规则

答案 1 :(得分:2)

card1card2都在for循环的范围内,而不是main()的其余部分。将初始化移至for

之前

答案 2 :(得分:0)

嗯,就目前而言,它会继续尝试覆盖card1和card2,因为你们都会声明并初始化它们“处理”时间。此外,更重要的是,它们将超出范围。相反,事先声明它并且只在循环中初始化它们。

你可能想要的是:

public class Testing
   {
    public static void main(String[] args)
   {

 int Deal = 1;

 ArrayList<Card> playerCards = new ArrayList<Card>();
 ArrayList<Card> computerCards = new ArrayList<Card>();

  //instantiate and derive values for Player
 Card card1;

 //instantiate and derive values for Computer
 Card card2;

 for(int Hand = 0; Hand < Deal; ++Hand)
 {
    card1 = new Card();
    card1.setSuit();  //assign card 1's suit
    card1.setValue(); //asign card 1's value

    card2 = new Card();
    card2.setSuit();  //assign card 2's suit
    card2.setValue(); //assign card 2's value



   //compare the two cards and make sure they are different
   cardCompare(card1,card2);

   playerCards.Add(card1);
   computerCards.Add(card2);

}

  //output the two cards to the screen

  output(card1,card2);

}

没有测试过,但它应该可以工作。

您还需要重新考虑使用Output方法。由于你每人将有大约20张卡, 时你认为你需要向用户展示吗?目前,您在for循环之外使用它,因此它只显示分配给每个循环的LAST值。如果你想向他们展示他们正在获得的每张卡,将输出调用放在for循环中,并且可能使用Thread.Sleep()暂停程序半秒左右,以便他们可以看到他们得到的每张卡。那,或写一个接受卡的ArrayList的输出的重载,并同时打印所有这些。再一次,如果你需要帮助,请问我。

顺便说一句,我不确定cardcompare()在幕后真正做了什么,但你可能想让它返回一个表示它们是否不同的bool。类似的东西:

bool areCardsDistinct = cardcompare(card1,card2);

这样,您可以使用结果来决定是否再次获得随机新卡