Конструктор вызова выдает «java .lang.NullPointerException» - PullRequest
0 голосов
/ 07 февраля 2020

Я строю класс карты Блэкджек, используя enum с конструкторами.

Когда я пытаюсь вызвать мой конструктор, я получаю java.lang.NullPointerException.

Я прочитал некоторые темы, которые говорит, что речь идет о null, но я до сих пор не могу понять, почему я получил эту ошибку.

Пожалуйста, смотрите мой код ниже (он компилируется, но выдает ошибку)


public class Card {

    /**
     *  each card should have a suit and a rank
     */

    // Create enumeration for suits, use our abbreviation as the String value

    enum SUIT {
            SPADE ("S"),
            HEART ("H") ,
            CLUB ("C"),
            DIAMOND ("D");

            // need constructor 
            private String abbreviation;

            private SUIT(String abbreviation) {
                this.abbreviation = abbreviation;
            }
    }


    // Create enumeration for ranks with String abbreviation and int value
    enum RANK {
        ACE ("A", 11), // don't worry about the value of ACE = 1 now, we can work on it later
        TWO ("2", 2),
        THREE ("3", 3),
        FOUR ("4", 4),
        FIVE ("5", 5),
        SIX ("6", 6),
        SEVEN ("7", 7),
        EIGHT ("8", 8),
        NINE ("9", 9),
        JACK ("J", 10),
        QUEEN ("Q", 10),
        KING ("K", 10);

        // need constructor 
        private String abbreviation;
        private int value;

        private RANK (String abbreviation, int value) {
            this.abbreviation = abbreviation;
            this.value = value;
        }
    }


    // instance var
    public SUIT suit;
    public RANK rank;

    // Card constructor, each card should have a suit and a rank
    public Card (SUIT suit, RANK rank) {
        this.suit = suit;
        this.rank = rank;
    }

    // method to get the name of the card
    public String name;
    {
        name = this.rank.abbreviation + this.suit.abbreviation;
    }

    public static void main (String[] args) {
        SUIT c = SUIT.CLUB;
        RANK j = RANK.JACK;

        System.out.println(c.abbreviation);
        System.out.println(j.abbreviation);
        System.out.println(j.value);

        Card cd = new Card(c, j);
    }

}

1 Ответ

5 голосов
/ 07 февраля 2020

Причина в том, что у вас есть блок инициализатора

// method to get the name of the card
public String name;
{
    name = this.rank.abbreviation + this.suit.abbreviation;
}

, который выполняется при создании экземпляра класса Card, но перед кодом конструктора. Это означает, что для полей this.rank и this.suit еще не задано какое-либо ненулевое значение.

Если комментарий верен и вы действительно хотите определить метод, а не блок инициализатора, вы бы нужно переписать это так:

// method to get the name of the card
public String name() {
    return this.rank.abbreviation + this.suit.abbreviation;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...