2014-02-17 3 views
0
Error: Exception in thread "main" java.lang.NullPointerException 
at Deck.toString(Deck.java:83) 
at DeckDriver.main(DeckDriver.java:25) 

Я полностью потерял мнение о том, почему я получаю это сообщение об ошибке. Предполагается, что в d.toString будет отображаться 52 строки кода, описывающих палубу d.NPE при обращении к toString

Палуба класс

import java.util.Random; 
public class Deck 
{ 
    private Card[] deck; 
    private int nextCard; 
    Face face; 
    Suit suit; 


    /** 
    * Default Constructor   
    * 
    * <hr> 
    * Date created: Feb 17, 2014 
    * 
    * 
    */ 
    public Deck() 
    { 
     nextCard = 0; 
     deck = new Card[52]; 
     int iCount; 
     for(iCount=0; iCount<52; iCount++) 
     { 
      Card c = new Card(iCount); 
     } 
    } 


    /** 
    * Copy Constructor   
    * 
    * <hr> 
    * Date created: Feb 17, 2014 
    * 
    * 
    * @param existingDeck 
    */ 
    public Deck(Deck existingDeck) 
    { 
     int i; 
     for(i=0;i<52;i++) 
     { 
      this.deck[i] = existingDeck.deck[i]; 
     } 
    } 

    /** 
    * toString   
    * 
    * <hr> 
    * Date created: Feb 17, 2014 
    * 
    * <hr> 
    * @return 
    * @see java.lang.Object#toString() 
    */ 
    public String toString() 
    { 
     int iCount = 0; 
     String description = ""; 
     for(iCount=0; iCount<52;iCount++) 
     { 
      description += deck[iCount].toString(); 
     } 
     return description; 
    } 

    /** 
    * Shuffles the deck  
    * 
    * <hr> 
    * Date created: Feb 17, 2014 
    * 
    * <hr> 
    */ 
    public void shuffle() 
    { 
     Random r = new Random(); 
     nextCard = 0; 
     int i; 
     for(i=0;i<52;i++) 
     { 
      int x = r.nextInt(52); 
      Card c = new Card(); 
      c=deck[x]; 
      deck[x]=deck[i]; 
      deck[i]=c; 
     } 
    } 

    /** 
    * Deals individual card.   
    * 
    * <hr> 
    * Date created: Feb 17, 2014 
    * 
    * <hr> 
    * @return 
    */ 
    public Card dealACard() 
    { 
     Card c; 
     c=deck[nextCard]; 
     nextCard++; 

     return c; 
    } 

    public String dealAHand(int handSize) 
    { 
     int i; 
     String hand=""; 
     for(i=0;i==handSize;i++) 
     { 
      hand+="" + dealACard(); 
     } 
     return hand; 
    } 
} 

класс DeckDriver

public class DeckDriver 
{ 
    public static void main(String[]args) 
    { 
     Deck d = new Deck(); 
     System.out.print(d.toString()); //(this is the DeckDriver.main(DeckDriver.java:25)) 
    } 
} 
+0

Я добавлю весь класс колоды. – user2909717

+1

В соответствии с вашим текущим кодом все элементы в вашем массиве «null» ... –

+0

Каково содержимое строки 83 в вашем классе Deck? – MondKin

ответ

0

Лучший способ предотвратить против NPE является использование Apache Commons Lang StringUtils.

В этом случае, похоже, что StringUtils.defaultString (deck [iCount]) станет для вас способом. Если оно равно null, defaultString вернет «" (пустую строку).

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#defaultString%28java.lang.String%29

Если вы решили не использовать StringUtils, лучшая практика, чтобы всегда проверять нуль перед выполнением .ToString().

1

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

1

Эти линии

for(iCount=0; iCount<52; iCount++) 
{ 
    Card c = new Card(iCount); 
} 

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

for(iCount=0; iCount<52; iCount++) 
{ 
    deck[iCount] = new Card(iCount); 
} 
+0

Отлично! Спасибо!! – user2909717

0

Вы инициализируете свой массив правильно, но не назначения новых Card с до него в конструкторе:

public Deck() 
{ 
    nextCard = 0; 
    deck = new Card[52]; 
    int iCount; 
    for(iCount=0; iCount<52; iCount++) 
    { 
     Card c = new Card(iCount); 
    } 
} 

Вы инстанцируете каждую карту ... потом выбросить. Это означает, что каждый элемент в вашем массиве deck равен null, поскольку это значение по умолчанию.

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