运行方法之前检查参数的最佳方法是什么?

4
所以,例如我有一个名为“divide”的方法,它将只是将两个整数相除并返回一个整数,那么检查被除数不等于0的最佳方式是什么?
方式1:
    private int divide(int i1, int i2) {
         if(i2 == 0) return 0;

         return i1/i2;
}

第二种方法:

    private int divide(int i1, int i2) {
        if(i2 != 0) {
            return i1/i2;       
        } else {
            return 0;
        }
    }

您更喜欢哪一个?

编辑:我知道,通常情况下你不会写这样的函数,因为如果除数为0,它会抛出异常。这只是为了澄清我的问题。

编辑2:我刚刚修改了方法函数,如果除数为0,则返回0。


1
我总是更喜欢具有较少解析节点的那个。在returnthrow之后的else总是多余的。 - Marko Topolnik
9个回答

1

我认为更常见且被广泛接受的是使用第一种方法,因为如果你要检查超过一两个变量,你就会得到非常长的行缩进。与第二种方法相比,第一种方法也更加简洁。


1
我更喜欢第二个,因为它更易读,如果你的需求在未来发生变化,比如i2==o,你可以很容易地维护它。

1

如果你的目的是在第二个参数为 0 时抛出 RuntimeException,那么你不需要做任何事情。

private int divide(int i1, int i2) {
    return i1/i2; // This will throw an ArithmeticException
}

上面的代码会抛出一个继承自RuntimeExceptionArithmeticException,从而减少了显式地抛出RuntimeException的工作。
编辑:由于你问题中的代码片段只是个示例,所以这里是更新后的答案。
在这种情况下避免不必要的else语句是更加干净和更好的做法,因为else是另一个分支块,如果你确实不打算在那里做太多事情,只需要一个return,那么代码没有它更好。
如果进入if,则返回,这样就可以使else无用,如果没有,则只需return回从方法返回即可。
private int divide(int i1, int i2) {
    if(i2 == 0) {
        return 0;
    }
    return i1/i2;
}

1
这只是一个例子,为了澄清我的问题。 - Timo V
@TimoV - 说实话,你不应该使用这样的例子。我建议你将问题改为抛出一个已检查的异常而不是未检查的异常,因为针对你当前手头上的问题,我上面发布的回答是最好的解决方案。 - Rahul
@TimoV - 在你编辑问题后,我更新了答案。 - Rahul

1

我更喜欢第二种方式,因为像Sanjay Rajjadi说的那样,它更易读。

private int divide(int i1, int i2) {
    if(i2 != 0) {
        return i1/i2;
    } else {
        throw new RuntimeException();
    }
}

但为什么要抛出异常?你可以显示一个警报或消息给用户,要求他插入一个新的整数。


1
个人而言,我不喜欢它们中的任何一个,因为抛出RuntimeException不是一个好的做法;你应该创建自己的Exception子类。除此之外,我看不出来明确抛出这个异常的必要性,因为结果异常(java.lang.ArithmeticException)是RuntimeException的子类。
也许你应该尝试这样做?
private int divide(int i1, int i2) throws DivisionByZeroException {
    try {
        return i1/i2;
    } catch(ArithmeticException e) {
        throw new DivisionByZeroException(e);
    }

0

0

如果非要这么做,我会使用第一种方法,因为如果检查很多参数,将会有大量的缩进。

尽管如此,我必须说:如果需要这样的检查,请始终进行两次评估。

在您的特定情况下,检查是多余的,因为除以0会抛出一个ArithmeticException,它会说:/ by zero

请参见this question,了解为什么人们经常夸大检查的重要性,特别是对于null/非null检查。


0
private int divide(int i1, int i2) throws IllegalArgumentException{
    if(i2==0)
    throw new IllegalArgumentException("Argument 'divisor' is 0");
    else return i1/i2;
}

0
使用以下方法。您无需检查零。只需抛出算术异常即可。
private int divide( int i1, int i2 ) throws ArithmeticException
{
    return i1/i2;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接