2013-10-15 5 views
-6

Он продолжает бросать это исключение, но он появляется между выходом программы, которая до сих пор работает точно так, как мне это нужно. В чем проблема?NullPointerException, но все еще работает?

Хорошо, так что это, где он бросает исключение: общественного класса RunGame {

public static void main(String[] args) { 
    //Create players 
    Hand Player1 = new Hand(5); 
    Hand Player2 = new Hand(5); 
    Hand Player3 = new Hand(5); 
    Hand Player4 = new Hand(5); 

    Deck deck = new Deck(); 
    Card print = new Card(1,'c'); 

    deck.Shuffle(); 
    for (int i = 0; i <= 52; i++){ 
     print = deck.getCard(i); //**THROWS HERE** 
     System.out.println(print.toString()); 
    }  

И тогда в моем классе деке есть:

public class Deck { 
private char suit; 
private int value; 
private Card [] deck = new Card[52]; 

public Deck(){ 

    int count = 0; 
    for(int i = 1; i <= 4; i++) { 
     if (i == 1) 
     { 
      suit = 'C'; 
     } 
     else if (i == 2) { 
      suit = 'D'; 
     } 
     else if (i == 3) { 
      suit = 'H'; 
     } 
     else { 
      suit = 'S'; 
     } 
     for (int x = 1; x <= 13; x++){ 
      deck[count] = new Card(x, suit); 
      count++; 
     } 
    } 
} 

и

public Card getCard(int i){ 
    int v = deck[i].getValue(); //**AND HERE** 
    char s = deck[i].getSuit(); 
    Card temp = new Card(v,s); 
    return temp; 
} 

I просто хотел распечатать колоду, чтобы убедиться, что она правильно перетасовывается. Все печатает великолепно, но это все еще показывает это. (Мой объект-колода представляет собой массив из 52 карт, а методы getValue и getCard относятся к классу карты.)

+6

Вы должны показать код - в частности линия, связанная с NPE. В противном случае вы просите нас угадать, что код не показан, и наши навыки ясновидения весьма ограничены. –

+1

Я бы посмотрел на трассировку стека и посмотрю, где это происходит. Проблема заключается в том, что код обращается к ссылке, которая является «null». –

+0

Пожалуйста, прикрепите полный код для вашего класса 'Deck'. – Trein

ответ

1

У вас есть 52 карты.
Если вы начинаете считать с 0 (по правилу), вы попадаете на карточку № 52 при счете 51.
Вы рассчитываете до 52 часов включительно; это неверно, потому что элемент 0 должен быть включен в счет.
Простая ошибка за один проход.

Изменить код:

for (int i = 0; i < 52; i++){ 
    print = deck.getCard(i); //No more exception 
+0

.... Я больше не смущен, я смотрел на это примерно полчаса и не понял. Большое спасибо soooo. – 007

+0

@ Мик, джокер отпустил вас, он не хочет, чтобы его не оставили, поэтому он бросает исключение. – Johan

1

Я предполагаю, что deck.getCard (i) в вашем цикле в какой-то момент возвращает null, а затем, когда вы пытаетесь вызвать toString() из этой нулевой ссылки, программа выйдет из строя.

Возможно, ваша петля должна сказать i < 52 вместо < =? Однако это должно было вызвать исключение ArrayIndexOutOfBoundsException. Это действительно сложно сказать, не видя всего класса Deck.

Смежные вопросы