Инициализированный массив объектов все еще получает исключение нулевого указателя?

Я совершенно новичок в программировании и пытаюсь создать покерную программу на Java.

Этот фрагмент кода находится в классе Player, где я пытаюсь создать пустую руку. Независимо от того, как я заполняю массив (циклом, вот так и т. д.), Eclipse сообщает мне, что у меня есть нулевой указатель, когда я пытаюсь вызвать метод из руки[1], руки[i] или чего-то еще.

Обычно ошибок времени компиляции не возникает. Но когда я конструирую каждую карту в раздаче по отдельности — см. ниже — компилятор расстраивается...

Соответствующие фрагменты Player и Class ниже.

Что я делаю не так? Я долго искал и все еще не понимаю.
Заранее спасибо!

class Player {

// Sets up a blank card array called "hand"
// with five (0,0) slots for real cards.
private Card[] hand = new Card[5];

private Card hand[0] = new Card(0, 0);  // error: syntax error on token "0", delete this token
private Card hand[1] = new Card(0, 0);  // error: syntax error on token "1", delete this token
private Card hand[2] = new Card(0, 0);  // error: syntax error on token "2", delete this token
private Card hand[3] = new Card(0, 0);  // error: syntax error on token "3", delete this token
private Card hand[4] = new Card(0, 0);  // error: syntax error on token "4", delete this token

class Card {
// Sets the default suit/number to zero.
// Lucky for me, such a 0-0 Card does not exist.
private int number = 0;
private int suit = 0;

// Constructs the Card itself by giving it a number and suit.
// Numbers/suits can *only* be set here.

public Card(int n, int s) {

    // Bound tester for suit/number values.
    // Number has to be between 1 and 14 inclusive (Ace low-Ace high).
    // Suit has to be between 1 and 4 inclusive (H/C/D/S).
    if (n > 0 && n <= 14 && s > 0 && s <= 4) {
        number = n;
        suit = s;
    }

person user2243038    schedule 04.04.2013    source источник
comment
Ваши утверждения, заполняющие массив hand, неуместны. Сделайте это в конструкторе.   -  person Sotirios Delimanolis    schedule 04.04.2013


Ответы (2)


Вы смешиваете объявление переменной с инициализацией массива, что приводит к синтаксически неправильному коду. Вы уже объявили массив, который хотите использовать в качестве хранилища, для его инициализации вы можете использовать блок:

private Card[] hand = new Card[5];

{
    hand[0] = new Card(0, 0); 
    hand[1] = new Card(0, 0);
    hand[2] = new Card(0, 0);
    hand[3] = new Card(0, 0);
    hand[4] = new Card(0, 0);
}

Вы также можете объявить и инициализировать массив в одной строке:

private Card[] hand = new Card[] {
    new Card(0, 0),
    new Card(0, 0),
    new Card(0, 0),
    new Card(0, 0),
    new Card(0, 0),
};
person Perception    schedule 04.04.2013
comment
Спасибо, это руководство посвящено блокам инициализации для тех, кто заинтересован . - person Sotirios Delimanolis; 04.04.2013

Причина ошибки в том, что строка

private Card hand[0] = new Card(0, 0);

выглядит как декларация для Java, и вы можете объявить только простой идентификатор.

person Ray Toal    schedule 04.04.2013