【问题标题】:How to deal with returning an object and handling errors如何处理返回对象和处理错误
【发布时间】:2013-01-23 02:56:17
【问题描述】:

感谢您查看我的问题。我有以下用于 Java 平台的代码。我想摆脱数组和玩具代码,并尝试为此使用最佳实践和面向对象的原则,我知道我可以用一种更简单但可重用性较低的方式来做到这一点。

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

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

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

2) 如果没有另一张卡片并且“卡片”为空,则运行 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();

}

【问题讨论】:

    标签: java exception-handling arraylist iterator return


    【解决方案1】:

    当一个方法由于内部错误而无法返回有意义的结果时,该方法应该抛出一个异常而不是仅仅返回一些东西。所以当你的draw方法发生错误而方法本身无法管理时,它应该自己抛出一个异常,然后由调用者处理。

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

    【讨论】:

    • +1 - 比返回 null 好得多,后者通常只会在返回后不久返回 java.lang.NullPointerException。
    • 我将如何处理多个捕获?正如我提到的,我尝试使用自定义异常,但是我想处理一个 DeckEmptyException 和一个 EndOfDeckException (我身后还有卡片,我可以用它来重新洗牌或重置迭代器)此外,它不是内部错误,而是我希望测试和处理的可能存在的状态。也许我应该把它分成其他方法,但我希望在这里有一种聪明、干净的方法来处理它
    • 当有多个错误条件时,draw 方法可能会为每个抛出不同的异常。 throws 关键字允许声明该方法可能抛出的无限数量的异常。单独的布尔类型方法来检查甲板是否为空或最后也可能有意义。当你有这样的方法时,在一个空的甲板上调用 draw 将更加值得例外,因为你希望调用者在绘制之前进行检查。
    • 在这种情况下,如何处理抛出的不同异常?
    • 对于每种异常类型,try-block 可以有不同的 catch-block。这允许您以不同的方式处理每个异常。当你想在一个块中处理多个异常时,你可以让它捕获一个异常类,它是它们的基类。当你想捕捉任何异常时,你甚至可以添加一个catch (Exception e) 块。这将捕获任何未被更专业的 catch 块处理的异常。后者通常被称为口袋妖怪异常处理(“必须抓住它们!”)。
    猜你喜欢
    • 2023-03-21
    • 2022-01-19
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多