0

我正在尝试调试为什么我的 Java 方法返回 null。这是详细信息。

我们正在制作一个简单的卡片“游戏”,我在调用外部方法和创建一个新对象时遇到了麻烦。它是一副卡片……所以卡片有 1 个类,卡片组有 1 个类,游戏有 1 个类

这是我的代码进入的课程

 public class Game
 {
  private InputReader reader;
  private Deck deck;
  private ArrayList<Card> listCard;

/**
 * Constructor for objects of class Game
 */
public Game()
{
    deck = new Deck();
    reader = new InputReader()
    listCard = new ArrayList<Card>();
}

/**
 *
 */
public void dealCard()
{
   listCard.add(deck.takeCard());
}

}// End of Game class

这是甲板类,我将从中获取方法

 import java.util.ArrayList;
 /**
  * Write a description of class Deck here.
  * 
  * @author  
  * @version 2012.05.31
  */
 public class Deck
{
private ArrayList<Card> redblue;

/**
 * Main constructor for objects of class Deck
 */
public Deck()
{
    redblue = new ArrayList<Card>();
}


   public Card takeCard()
{
      **return redblue.remove(0);**  /// this is the Index.pointer.exception
}



}
}// End of class

所以我的问题是我试图从甲板上拉出第一张卡并将其添加到我的“手”中。所以我试图调用 dealCard() 调用 takeCard() ..takeCard() 工作正常但是当我尝试和如果通过 dealCard() 调用它会返回 null 并输出错误,因为我无法将 null 添加到 arrayList .. 我认为我的问题可能是外部方法调用没有使用正确的变量,我不知道

提前致谢

***已编辑。删除了不相关的方法和类..

4

4 回答 4

2

查看 Deck 的构造函数:

public Deck()
{
    redblue = new ArrayList<Card>();
}

构造函数运行后,redBlue ArrayList 中有多少张卡片?

如果您尝试从该 ArrayList 中删除一张卡片,您认为会发生什么?

于 2012-06-11T10:57:11.253 回答
1

我认为您需要从您的主(游戏类)中发布更多代码,向我们展示您的套牌和卡片类的用法。现在唯一引起我注意的是:

public Card takeCard()
{
      **return redblue.remove(0);**  /// this is the Index.pointer.exception
}

根据这一点,如果出现以下情况,可能会引发异常:

IndexOutOfBoundsException - if index out of range (index < 0 || index >= size()).

你确定你的牌堆里装满了卡片吗?您可以在您的方法中添加检查。如果您的卡片列表为空,则 0 = 它的大小。

public void dealCard()
{
   Card card = deal.takeCard();

   if (card != null)
      listCard.add(deck.takeCard());
}

public Card takeCard()
{
    if ( !this.redblue.isEmpty() )
        return redblue.remove(0);

    return null;        
} 
于 2012-06-10T23:43:11.150 回答
0

不知何故,你的第一个元素

redblue

一片空白。ArrayList 中允许空值。

我的猜测是,您在卡片组中填写的代码更多,并且您第一次添加null到卡片中ArrayList

在此处检查ArrayList规范。

于 2012-06-13T16:53:23.930 回答
0

在我看来,redblue 实际上并没有任何东西!当你像这样初始化它时:

redblue = new ArrayList<Card>();

您只是在为 Cards 创建一个空容器,而不是实际将卡片放入其中。您可能想要做的是创建一个函数来为 redblue 生成卡片......类似......

public ArrayList<Card> createInitialDeck(){ 
  //Create an empty ArrayList
  //Do some code here to create new cards..
       //you might want to consider nested for loops if you're creating 13 cards of 4 different suits for example
       //while inside those for loop add each new card object to your array list

   //return arrayList;
}

然后代替redblue = new ArrayList<Card>();你做redblue = createInitialDeck();.

于 2012-10-20T20:06:39.857 回答