有些东西可能出错,但也不例外

Mad*_*sen 10 java oop methods exception

我经常处于这样一种情况:我有一种方法会出现问题但是例外情况不适合使用,因为它并不例外.

例如:

我正在设计一个垄断游戏.类银行有一个方法buyHouse和一个计算剩余房屋数量的字段(垄断中有32个房屋).可能出错的是玩家在剩下0时买房子.我该怎么办呢 这是我能提出的3种方法.

1. public void buyHouse(Player player, PropertyValue propertyValue)
{
    if(houseCount < 0) throw new someException;
    ....
    //Not really an exceptional situation
}

2. public boolean buyHouse(Player player, PropertyValue propertyValue)
{
    if(houseCount < 0) return false;
    ....
    //This I think is the most normal approach but changing something
    //and returning if it was a success seems bad practice to me.
}

3. public boolean housesLeft()
{
    if(houseCount > 0) return true;

    return false;

    //Introducing a new method. But now I expect the client to call this method
    //first before calling buyHouse(). 
}
Run Code Online (Sandbox Code Playgroud)

你会怎么做?

Yis*_*hai 12

我会一起做3和1.API的正确用法是在购买之前检查是否有房屋.但是,如果开发人员忘记这样做,则抛出运行时异常.

如果它是一个多线程的情况(许多人同时买房子),它会变得更加复杂.在这种情况下,我确实会考虑一个已检查的异常,如果不是一个返回布尔值的tryToBuyAHouse方法,而是一个对buyHouse方法的运行时异常.

  • 我也会说这个.我认为IllegalStateException是合适的. (2认同)

Tof*_*eer 5

这非常类似于从空堆栈弹出项目的想法...这是例外.你正在做一些应该失败的事情.

将特殊情况视为您希望通知程序员出现问题并且您不希望它们忽略它的情况.使用简单的布尔返回值不是"正确的",因为程序员可以忽略它.还有一个方法应该被调用以检查是否有可用的房屋是一个好主意.但请记住,在某些情况下,程序员会忘记调用它.在这种情况下,异常用于提醒他们在获取房屋之前需要调用该方法来检查房屋是否存在.

所以,我会提供检查有房屋的方法,并期望人们会调用它并使用true/false返回值.倘若他们不调用该方法,或者忽略返回值,我会抛出一个异常,这样的比赛没有得到投入不良状态.