我在使用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时出现了这个错误。除非,与驱动程序相比,在类中使用开关有不同的方法。
此外,请忽略任何逻辑错误,因为这仍然是一项正在进行的工作。我至少需要先编译程序才能解决任何逻辑错误。
感谢您的帮助!
答案 0 :(得分:3)
该属性名为pl
,不是 p1
,除了p1
在TrumpWar()
构造函数中声明为局部变量之外,无法从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]);
现在正在实例化属性p1
和p2
,在您的代码中,您声明了几个碰巧具有(几乎)同名的局部变量属性 - 编译器警告应该告诉你。
答案 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为空。