2016-03-03 77 views
0

我收到帶有交換機的cannot find symbol錯誤。然而,我已經完成了切換,那是在司機。這是我第一次在自己班上使用開關。反正這裏是我的代碼示例:(Java)交換機找不到符號

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

您可能需要重命名CardPile pl;到CardPile p1;也不要在構造函數中重新聲明它們。 –

回答

3

屬性被命名爲plp1,此外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被實例化,在你的代碼中聲明瞭幾個局部變量正巧有(幾乎)相同的名稱屬性 - 編譯器警告應該告訴你。

+3

並將課程頂部的pl重命名爲p1。 –

+2

@ Jean-FrançoisSavard好搭檔! –

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爲null。