(Java)Switch无法找到符号

时间:2016-03-03 00:17:01

标签: java class switch-statement

我在使用cannot find symbol时遇到错误。我之前做过切换,那是在驱动程序中。这是我第一次在自己的班级中使用开关。无论如何,这里有我的代码样本:

import java.util.*;
public class TrumpWar
{

   protected CardPile pl;
   protected CardPile p2;
   protected CardPile tCard;
   protected CardPile treasury;

   public TrumpWar( )
   {
        CardPile cp = new CardPile (new Card [52]);
        cp.shuffle();

        CardPile tCard = new CardPile();
        for (int i=0; i<6; i++)
            tCard.get(i);
        cp.shuffle();

        CardPile p1 = new CardPile(new Card [26]);
        CardPile p2 = new CardPile(new Card [26]);
    }

public void play()
{
    Scanner kb = new Scanner(System.in);
    do
    {
        System.out.println("At each turn, type: ");
        System.out.println("P to print");
        System.out.println("M to mix (shuffle the cards)");
        System.out.println("S to save");
        System.out.println("Q to quit");
        System.out.println("just ENTER to play a turn");

        String meunChoice = kb.nextLine();

        if(!meunChoice.equals("M") || !meunChoice.equals("m") || !meunChoice.equals("P") || !meunChoice.equals("p") || !meunChoice.equals("Q") || !meunChoice.equals("q") || !meunChoice.equals("S") || !meunChoice.equals("s") || !meunChoice.equals(str = String.valueOf(kb.nextLine())))
            throw new IllegalArgumentException ("Incorrect input, please re-enter.");
        else
        {
            switch (meunChoice)
            {
                case ("P"):
                case ("p"):     System.out.println("Player1 cards: " + p1.toString()); //<--- Cannot find p1.
                                System.out.println("Player1 cards: " + p2.toString());
//More codes...

我清楚地知道为什么在显然我已经在交换机范围之外声明了p1时出现了这个错误。除非,与驱动程序相比,在类中使用开关有不同的方法。

此外,请忽略任何逻辑错误,因为这仍然是一项正在进行的工作。我至少需要先编译程序才能解决任何逻辑错误。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

该属性名为pl不是 p1,除了p1TrumpWar()构造函数中声明为局部变量之外,无法从play()访问它。你要做的是:

// outside

protected CardPile p1; // you wrote pl, rename it!

// in the constructor

p1 = new CardPile(new Card [26]);
p2 = new CardPile(new Card [26]);

现在正在实例化属性p1p2,在您的代码中,您声明了几个碰巧具有(几乎)同名的局部变量属性 - 编译器警告应该告诉你。

答案 1 :(得分:0)

问题似乎是你通过在构造函数中重新声明它们来遮蔽p1和p2变量。

而不是

 CardPile p1 = new CardPile(new Card [26]);
 CardPile p2 = new CardPile(new Card [26]);

尝试

 p1 = new CardPile(new Card [26]);
 p2 = new CardPile(new Card [26]);

不同之处在于,在第一种情况下,您要声明一个变量(因为它具有类类型,即CardPile),而在第二种情况下,您使用的是已经在顶部声明的变量,这是您想要做的显然。

因此,如果在构造函数中重新定义变量p1和p2,它们将在其外部保持未定义,即在play()内部p1和p2为空。