Java 为什么会发生这些nullPointerException

Java 为什么会发生这些nullPointerException,java,nullpointerexception,Java,Nullpointerexception,我读过这篇关于空指针异常的文章,但仍然无法解决我的问题 这是我为扑克牌游戏编写的playingCard类。我既有纸牌课又有套牌课 class Card { /* constant suits and ranks */ static final String[] Suit = {"Clubs", "Diamonds", "Hearts", "Spades"}; static final String[] Rank = {"", "A", "2", "3", "4", "5

我读过这篇关于空指针异常的文章,但仍然无法解决我的问题

这是我为扑克牌游戏编写的playingCard类。我既有纸牌课又有套牌课

class Card {

    /* constant suits and ranks */
    static final String[] Suit = {"Clubs", "Diamonds", "Hearts", "Spades"};
    static final String[] Rank = {"", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};

    /* Data field of a card: rank and suit */
    private int cardRank;  /* values: 1-13 (see Rank[] above) */
    private int cardSuit;  /* values: 0-3  (see Suit[] above) */

    /* Constructor to create a card */
    /* throw MyPlayingCardException if rank or suit is invalid */
    public Card(int rank, int suit) throws MyPlayingCardException {
        if ((rank < 1) || (rank > 13))
            throw new MyPlayingCardException("Invalid rank:" + rank);
        else
            cardRank = rank;
        if ((suit < 0) || (suit > 3))
            throw new MyPlayingCardException("Invalid suit:" + suit);
        else
            cardSuit = suit;
    }

    /* Accessor and toString */
    /* You may impelemnt equals(), but it will not be used */
    public int getRank() {
        return cardRank;
    }

    public int getSuit() {
        return cardSuit;
    }

    public String toString() {
        return Rank[cardRank] + " " + Suit[cardSuit];
    }

    /* Few quick tests here */
    public static void main(String args[]) {
        try {
            Card c1 = new Card(1, 3);    // A Spades
            System.out.println(c1);
            c1 = new Card(10, 0);    // 10 Clubs
            System.out.println(c1);
            c1 = new Card(10, 5);        // generate exception here
        } catch (MyPlayingCardException e) {
            System.out.println("MyPlayingCardException: " + e.getMessage());
        }
    }
}
类卡{
/*不变的诉讼和等级*/
静态最终字符串[]套装={“梅花”、“钻石”、“红心”、“黑桃”};
静态最终字符串[]秩={”、“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“J”、“Q”、“K”};
/*卡的数据字段:等级和等级*/
private int cardRank;/*值:1-13(参见上面的秩[])*/
private int cardSuit;/*值:0-3(参见上文的Suit[]*/
/*构造函数创建一张卡片*/
/*如果等级或等级无效,则抛出MyPlayingCardException*/
公共卡(整数等级,整数套装)抛出MyPlayingCardException{
如果((秩<1)| |(秩>13))
抛出新的MyPlayingCardException(“无效排名:+rank”);
其他的
cardRank=等级;
如果((诉讼<0)| |(诉讼>3))
抛出新的MyPlayingCardException(“无效诉讼:+诉讼”);
其他的
cardSuit=西装;
}
/*存取器和toString*/
/*您可以强制使用equals(),但不会使用它*/
public int getRank(){
返回cardRank;
}
公共int getSuit(){
返回卡片套装;
}
公共字符串toString(){
返回等级[cardRank]+“”+Suit[cardSuit];
}
/*这里有一些快速测试*/
公共静态void main(字符串参数[]){
试一试{
卡c1=新卡(1,3);//黑桃
系统输出打印LN(c1);
c1=新卡(10,0);//10个俱乐部
系统输出打印LN(c1);
c1=新卡(10,5);//在此处生成异常
}捕获(MyPlayingCard例外){
System.out.println(“MyPlayingCardException:+e.getMessage());
}
}
}

类组{
/*这用于跟踪原始n*52卡*/
私人名单原件;
/*这从原始牌组的n*52张牌组开始*/
/*它用于跟踪要处理的剩余卡*/
/*请参阅reset():它将DealDealDeck重置为全甲板*/
私人名单;
/*此对象中的甲板数*/
私人国际号码;
/**
*构造函数:创建一副默认的52张扑克牌
*将它们复制到DealDeck。
*初始化numberdocks=n
*注意:您需要从卡构造函数捕获MyPlayingCardException
*将ArrayList同时用于originalDecks和DealDealDeck
*/
公共甲板(){
//实施这个方法!
ArrayList originalDecks=新的ArrayList(52);
ArrayList dealDecks=新的ArrayList(52);
卡片;

对于(int i=0;i您有两个
deck
构造函数,它们有两个不同的问题:

Decks()
构造函数(无参数):
Deck()
构造函数中的这一行创建了一个local变量,该变量对实例成员进行阴影(隐藏):

ArrayList<Card> originalDecks = new ArrayList<Card>(52);
originalDecks = new ArrayList<Card>(52);
您在
dealdeck
上也有同样的问题

Decks(int)
构造函数: 这一行更简单:您从未分配给
originalDecks
,因此它保持其
null
值,并且您突出显示的行将抛出。如果没有,它将稍后在
dealDecks上抛出。添加
行,因为您也从未分配任何内容给
dealDecks


这一点是主观的

第一个问题是我建议在引用实例成员时始终使用
this.
的原因之一:

this.originalDecks = new ArrayList<Card>(52);
this.originalDecks=newarraylist(52);

这样一来,A)很明显您处理的是一个实例成员而不是一个局部变量,B)这样您就不会犯这个错误(因为
arraylistthis.originalDecks=…
将是一个语法错误)。一些IDE和lint工具甚至有一个选项,您可以启用它,使其不使用
此选项。
在实例上可能会出现错误或警告。

仅供参考,在代码标记中,您不能应用其他标记(如您尝试应用的强标记)。恐怕这不是问题。我“我试图在构造函数中创建originalDeck和dealDeck,而不是实例变量。@LijieZhou:实际上有两个问题,具体取决于您所说的构造函数。这两个问题都需要解决,请参见上文。这两种情况下的解决方法都是一样的:初始化实例成员,因为两个构造函数都不这样做。”。
this.originalDecks = new ArrayList<Card>(52);