2016-11-07 17 views
1

Javaで標準的なカード/デッキクラスを作成すると悪い時があります。私はいくつかの同様の質問&答えを読んだが、どちらかrelatable /有用ではないか、私はまだそれを理解することはできません。 ここCards.set(Cards.java:13)の "メイン" スレッドでコードNullPointerException、調査後でも理由を見つけることができない

public class Cards { 
    boolean isAvailable; 
    int card_id; 
    static final int AC = 32; 
    public Cards [] deck = new Cards[AC]; 

    public void set() { 
     int a = 0; 
     for (int i = 0; i < AC; i++) { 
      if(a == 4) a = 0; 
      deck[i].isAvailable = true;  // <--------- 
      deck[i].card_id = i + (a * 101); // <--------- 
      a++; 
     } 
    } 
    public void read() { 
     for (int i = 0; i < AC; i++) 
     System.out.println(deck[i].isAvailable + " " + deck[i].card_id); 
    } 
    public static void main (String[] args) { 
     Cards c = new Cards(); 
     c.set(); 
     c.read();  
    } 
} 

例外java.lang.NullPointerExceptionが
Cards.mainで
'S(Cards.java:24)

1. 私は同様の問題について読み、その問題は、配列の初期化にすることができ、私は私のPROGと同じことをしようとしましたが、それはとにかく悪い行ったことがわかりました。

私は13行目と14行目がポイントされています(チェックのために13行目をコメントすると、次の行にポインターセットをコメントします)。

2. 私はあなたから取得したいと思い、ヘルプの次の部分がある: (トレーニング目的のために)メインがあるにもかかわらず、私は(ちょうどデッキを作成します)、このクラスを使用して他のクラスを参照してくださいので、私は私が勝ったと思いますメインを必要としているのではない...最初のポイントでprobsのほかにすべてがうまく設定されているか?

+2

* *アレイの初期化に関して「同じことをやろうとしましたか?あなたが 'deck [i]'に値を設定したところはどこにもありません... –

+3

あなたのコードにバグがあるときは、あなたのデバッガを使うことをお勧めします。それが何のためだ。 –

+0

「カード」は、カードのコレクションとして「カード」から1枚のカードとして分けることをお勧めします。現在のところ、各カードには52個のカードが配列されており、意味がありません(特に、それぞれのカードに52個のカードなどがあります)。 –

答えて

9

非常に簡単:

public Cards [] deck = new Cards[AC]; 

は、カードオブジェクトのスロットのAC番号で配列を作成します。

これで、ヌル以外のカードオブジェクトを各スロットに挿入する必要があります。

実際には抽象が壊れています。

あなたはカードと同じようにカードを取るように見えるコードを書いたがを設定 - あなたのカードのクラスにカードの配列を追加することによって!そして、それは実際に〜あなたの現在のコードを修正します。あなたは...あなたはすぐに新しいカードを作成する無限の再帰(に実行が作成につながることをしようとした場合

public Cards() { 
    deck = new Cards[AC]; 
    for (int i=0; i<deck.length;i++) { 
    deck[i] = new Cards(); 
} 

のようなコンストラクタを追加することです。この問題を解決するには、「通常」の方法として、 AC新しいカード(配列を埋めるために)、非常にすぐにStackOverflowの原因

したがって本当の答えは、これらの線に沿ってどこかに行く:。

public class Card { 
    ... a class that represents a SINGLE card in your game 

、その後

public card GameOfCards { 
    ... a class that (for example!) uses an array to hold n objects of class Card! 
は最後に、ピーターは彼のコメントに示しているよう:あなたはデバッグを使用することを学ぶ必要があり、このような問題を自分で動作するようにを意味します。1つの良い方法:データ構造を使用する前に、そのデータ構造を繰り返してその内容を印刷します。デバッガを使用する方法を学び、コードをステップバイステップで歩いていくことができます。ご理解ください:これは非常に基本のものです。あなたはとなります。はここに持ち込まないでください。

+1

デバッガを使用すると、すぐにこの+1が表示されます。 –

+1

@PeterLawrey私の答えの "質問以上の"質。もちろん、あなたは「彼がどのようにこれをデバッグするべきか」について正しくあります;-) – GhostCat

+0

私はカード対カードの分離に同意します。申し訳ありませんが、私は2回投票できません。私はそれをデッキと呼ぶことはしません。通常、LinkedHashSetのような順序付けされたセットですが、ほとんどのセットはそうではありません。 –

関連する問題