2011-03-04 60 views
2

我是java编程的初学者。我正在尝试重新制作纸牌游戏战争的简化版本。我跑我的程序,它被张贴下方,它回来了与此错误:线程“main”中的异常java.lang.NullPointerException?

异常线程“main”显示java.lang.NullPointerException

在cardgame.BuildDeck(cardgame.java:36)

在cardgame.main(cardgame.java:60)

我一直在试图通过研究来解决我自己的这个问题,但我不解决这个问题。我想知道是否有人可以帮助我。如果您确实需要关于我的程序的其他信息,请随时询问。提前致谢!

-FGxMatta

public class cardgame 
{ 
static class TheCard 
{ 
    // Java getter & setter 
    private String CardName; 
    private int CardRank; 
    private int Chosen; 

    public TheCard(int rank, String name) 
    { 
     this.CardName = name; 
     this.CardRank = rank; 
     this.Chosen = 0; 
    } 
} 


@SuppressWarnings("null") 
private static TheCard[] BuildDeck() 
{ 
    TheCard[] TheDeck = null; 
    String[] Cards = {"2","3","4","5","6","7","8","9","10","Jack","Queen","King","Ace"}; 
    String[] Suits = {"Spades","Hearts","Diamonds","Clubs"}; 
int[] Rank = {2,3,4,5,6,7,8,9,10,11,12,13,14}; 
    int cardnumber = 0; 
    for (int i = 0; i < Cards.length; i++) 
    { 
     for (int j = 0; j < Suits.length; j++) 
     { 
      String deckcard = Cards[i]; 
      String suitcard = Suits[j]; 
      String cardname = deckcard + "-" + suitcard; 
      TheDeck[cardnumber] = new TheCard(Rank[i], cardname); 
      cardnumber++; 
     } 
    } 
    return TheDeck; 
} 
private static TheCard GetRandomCard(TheCard[] OrderedDeck) 
{ 
    TheCard thecard; 
    int random = (int) (51*Math.random()); 
    thecard = OrderedDeck[random]; 
    if (thecard.Chosen == 0)  // if available... 
    { 
     thecard.Chosen = 1;   // mark it taken... 
     return thecard; 
    } 
    else 
    { 
     return GetRandomCard(OrderedDeck); 
    } 
} 

public static void main(String args[]) 
{ 
    TheCard[] OrderedDeck = BuildDeck(); 
    System.out.println ("Welcome, Prepare for War!"); 
    int decksize = OrderedDeck.length; 
    int player1wincount = 0; 
    int player2wincount = 0; 
    int tiecount = 0; 
    for (int cardcount = 0; cardcount < decksize;) 
    { 
     TheCard Player1 = GetRandomCard(OrderedDeck); 
     cardcount++; 
     TheCard Player2 = GetRandomCard(OrderedDeck); 
     cardcount++; 
     System.out.println ("Player 1's card is: " + Player1.CardName); 
     System.out.println ("Player 2's card is: " + Player2.CardName); 
     if (Player1.CardRank > Player2.CardRank) 
     { 
      System.out.println("Player 1 wins this hand"); 
      player1wincount++; 
     } 
     if (Player1.CardRank < Player2.CardRank) 
     { 
      System.out.println("Player 2 wins this hand"); 
      player2wincount++; 
     } 
     if (Player1.CardRank == Player2.CardRank) 
     { 
      System.out.println("Player 1 and Player 2 played the same valued card"); 
      tiecount++; 
     } 
    } 
    System.out.println ("Player 1 won " + String.valueOf(player1wincount) + " hands"); 
    System.out.println ("Player 1 won " + String.valueOf(player2wincount) + " hands"); 
    System.out.println ("There were " + String.valueOf(tiecount) + " ties"); 
} 
} 
+2

如果你希望编译器给你一个大:

TheCard[] OrderedDeck = BuildDeck(); 

应代之以提示问题出在哪里,删除行'@SuppressWarnings(“null”)'然后您会准确地知道您尝试访问空对象的位置。 – DaveJohnston 2011-03-04 17:22:55

+4

我假设你在使用Eclipse,并且Eclipse提示'@SuppressWarnings(“null”)'。删除该行并修复导致警告的代码。警告是指示问题。在知道后果之前不要使用@ SuppressWarnings。警告试图阻止您收到的确切错误。 – 2011-03-04 17:23:36

回答

10

替换:

TheCard[] theDeck = null; 

有:

TheCard[] theDeck = new TheCard[Cards.length * Suits.length]; 

,并将其移动到下面的声明为CardsSuits

+0

非常感谢您的帮助! – FGxMatta 2011-03-04 23:04:09

1

这里

TheDeck[cardnumber] = new TheCard(Rank[i], cardname); 

你永远不会初始化TheDeck。你可能想要类似于

TheDeck = new TheCard[52]; 

在你开始把东西放入数组之前。

作为一个说明,java约定是变量名是骆驼壳。所以“CardName”应该是cardName。只是一个约定。

1

TheCard[] theDeck = null;

你不需要无伤害性吗?

3

空指针异常是代码中您尝试访问/修改尚未初始化的对象的情况。它基本上意味着对象引用变量不指向任何地方,并且指向任何内容或“null”。一个简单的例子可以是:

package au.com.copl; 
public class Demo{ 
    public static void main(String[] args) { 
     String d = null; 
     System.out.println(d.toString()); // d is un-initialized and is null 
    } 
} 
0

你也应该在main方法使用new

TheCard[] OrderedDeck = new BuildDeck(); 
相关问题