如何处理返回对象和处理错误

时间:2013-02-07 14:51:52

标签: java exception-handling arraylist iterator return

感谢您查看我的问题。我有一个Java套牌的以下代码。我想远离数组和玩具代码,并尝试使用最佳实践和面向对象的原则,我知道我可以用更简单但不太可重用的方式来实现这一点。

最终目标是创建一个卡片游戏框架,我可以用它来处理套牌管理的平凡部分,同时专注于不同游戏的实现。

我的错误处理问题。我对draw()代码的想法如下 -

1)如果有另一张卡返回它并移动迭代器。这将消除丢弃堆的需要,因为丢弃物将位于迭代器后面,而.last()卡是刚绘制的。

2)如果没有另一张卡且“cards”为空,请运行emptyDeck()方法。该方法将在子类中实现。例如,在单人纸牌游戏中,您可能希望在经过甲板x次之后结束游戏,因此您可能不想再画一张牌。

3)如果牌组不是空的并且你没有更多牌,那么你调用endOfDeck()方法,该方法将被子类化。同样,您可能想要对套牌进行随机播放或只是重置迭代器

但是我得到旧的“必须返回卡”错误消息。我已经尝试创建自定义异常,但我只能指定一个处理程序方法。谁能建议一个聪明的方法来做到这一点?

    public abstract class Deck 
{

private ArrayList<Card> cards;
private ListIterator<Card> deckPosition = cards.listIterator();
/**
 * 
 */
public Deck() 
{   
}

public Card draw()
{
    Card drawn;

    try
    {
        if(deckPosition.hasNext())
        {
            drawn = deckPosition.next();
        }
        else if(cards.isEmpty())
        {
            emptyDeck();
        }
        else
        {
            endOfDeck();
        }
    }

    catch(Exception e)
    {
        System.out.println("Exception when drawing a card, check try/catch block in draw() method of Deck");
        e.printStackTrace();
    }

    finally
    {
        return drawn;
    }
}

public abstract void endOfDeck();
public abstract void emptyDeck();

}

1 个答案:

答案 0 :(得分:3)

当一个方法由于内部错误而无法返回有意义的结果时,该方法应该抛出一个异常而不是只返回一些异常。因此,当draw方法中出现错误时,方法本身无法管理,它应该抛出一个异常,然后由调用者处理。

在这种情况下,我将创建一个新的异常类DeckEmptyException。当牌组为空时,draw方法会抛出该异常而不是返回牌。无论谁调用draw方法,都必须处理这个异常。