如何在对象尚未初始化时跳过while()循环的条件?

时间:2012-12-07 10:34:59

标签: java while-loop initialization

我收到了NullPointerException,因为我尝试从尚未初始化的对象中检查某个值,值仍为null值。这样做的原因是我只在必要时等待初始化对象,如果没有必要,我想我不需要浪费更多的内存空间。

我收到此异常,因为player2.getHandTotal()尚未初始化,因此没有从中提取值的方法。现在,我应该如何制定我的while循环,以便在检查值时不抛出此异常?我试图抛出(player2 != null && dealer.getHandTotal() <= player2.getHandTotal())并希望对其进行短路检查,但这不起作用......

player2意味着当一张牌split用于同一牌手的2手牌时将使用的牌。如果没有split的要求,例如没有2张牌或牌不同,那么我不需要player2对象进行初始化。

我真的不想加倍我的代码!这样做的原因是我需要加倍大量代码!即使没有必要,我最好初始化player2对象!

如何解决这个问题?

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

5 个答案:

答案 0 :(得分:1)

附加条件 player2!= null 应该有效。还有什么东西会抛出NullPointerException吗?在进行以下更改后,您能告诉我们堆栈跟踪吗?

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

答案 1 :(得分:0)

如果在进入循环之前它是否为空,你能检查所有值吗?比如说这个if(object1 != null && object2 !=null )或者它是原始类型if(value == -1 || value == 0)`。因此,在进入循环之前,您需要对所有值进行验证

答案 2 :(得分:0)

如果您不确定它不会为空,则不能在条件语句中使用player2.getHandTotal

当player2为null时,表示满足第一个条件,但这也意味着第二个条件将抛出NullPointerException,因为你在那里使用同一个引用方法。

我建议在进入while循环之前检查一些值是否为null。

答案 3 :(得分: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
}

我希望这会有所帮助

答案 4 :(得分:0)

  

播放器2意味着当卡片分开时将使用的手牌   为同一个玩家分成两只手。如果没有要求   分裂如没有2张卡或卡等级不一样然后我没有   需要初始化player2对象。

所以你的班级结构不正确:玩家(和经销商)应该有一个或多个牌,条件应该是这样的:

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()中添加一个额外的循环。