0

まだ初期化されていないオブジェクトから値をチェックしようとしましたが、値がまだnull値であるため、NullPointerExceptionが発生します。これは、必要な場合にのみオブジェクトを初期化するのを待っているためです。必要がない場合は、メモリスペースを無駄にする必要はないと思います。

player2.getHandTotal()まだ初期化されていないため、この例外が発生しているため、値を取得するメソッドがありません。さて、値をチェックするときにこの例外をスローしないように、whileループをどのように定式化する必要がありますか?私は投げようとしました(player2 != null && dealer.getHandTotal() <= player2.getHandTotal())、そしてそれをチェックする短絡を望んでいました、しかしそれはうまくいきません...

カードが同じプレーヤーの2つのハンドにあるときplayer2に使用されるハンドを意味します。2枚のカードがない、またはカードのランクが同じでないなどsplitの要件がない場合は、オブジェクトを初期化する必要はありません。splitplayer2

私は本当に自分のコードを2倍にしたくありません!これは、たくさんのコードを2倍にする必要があるためです。そして、必要がない場合でも、オブジェクトを初期化したほうがいいでしょうplayer2

これを修正する方法は?

while(dealer.getHandTotal() <= 15 && 
        (dealer.getHandTotal() <= player.getHandTotal() || 
        dealer.getHandTotal() <= player2.getHandTotal()))
{
    deck = drawFromDeck(deck, dealer);
}
4

5 に答える 5

1

追加された条件player2!=nullが機能するはずです。NullPointerExceptionをスローしている他の何かがありますか?次の変更を行った後、スタックトレースを表示できますか?

while (dealer.getHandTotal() <= 15 && 
        (dealer.getHandTotal() <= player.getHandTotal() || 
        (player2 != null && dealer.getHandTotal() <= player2.getHandTotal())))
{
    deck = drawFromDeck(deck, dealer);
}
于 2012-12-07T11:12:52.610 に答える
0

player2.getHandTotalnullにならないことが確実でない場合は、条件ステートメントで使用できません。

player2がnullの場合、最初の条件が満たされていることを意味しNullPointerExceptionますが、メソッドで同じ参照を使用するため、2番目の条件がスローされることも意味します。

whileループに入る前に、いくつかの値がnullかどうかを確認することをお勧めします。

于 2012-12-07T10:42:02.453 に答える
0

ループに入る前でも、すべての値がnullであるかどうかを確認できますか?このように言うif(object1 != null && object2 !=null )か、プリミティブ型の場合if(value == -1 || value == 0)`。したがって、ループに入る前に、すべての値の検証があります

于 2012-12-07T10:39:33.797 に答える
0

メモリスペースを無駄にしたくないとのことですが、それが可能かどうかはわかりません。おそらくそうですが、ループの周りまたはループ内のtry-catchブロックでNullPointerExceptionをキャッチしたいと思います。

try{
  while(dealer.getHandTotal() <= 15 && 
        (dealer.getHandTotal() <= player.getHandTotal() || 
        dealer.getHandTotal() <= player2.getHandTotal()))
  {
    deck = drawFromDeck(deck, dealer);
  }

} catch (NullPointerException npe){
  // do something
}

これがお役に立てば幸いです

于 2012-12-07T10:45:13.687 に答える
0

player2は、同じプレーヤーのカードが2つのハンドに分割されたときに使用されるハンドを意味します。2枚のカードがない、またはカードのランクが同じでないなど、分割の要件がない場合は、player2オブジェクトを初期化する必要はありません。

したがって、クラス構造は正しくありません。プレーヤー(およびディーラー)は1つ以上のハンドを持ち、条件は次のようになります。

while(dealer.getHand().getTotal() <= 15 && 
        dealer.getHand().getTotal() <= getMaximumHandTotal()) {
   ...
}

private int getMaximumHandTotal() {
   int max = -1;
   for(Hand hand : player.getHands()) {
      if(hand.getTotal() > max) { max = hand.getTotal(); }
   }
   return max;
}

その後、プレーヤーを追加する場合は、getMaximumHandTotal()にすべてのプレーヤーにループを追加する必要があります。

于 2012-12-07T12:15:06.957 に答える