在运行方法之前检查参数的最佳方法

时间:2014-04-09 12:05:02

标签: java arguments conditional-statements

所以, 例如,如果我有一个名为“divide”的方法,它只会划分为int并返回一个int,那么检查除数的最佳方法是什么!= 0

方式1:

    private int divide(int i1, int i2) {
         if(i2 == 0) return 0;

         return i1/i2;
}

方式2:

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

您更喜欢哪一个?

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

编辑2:如果除数为0,我只是将方法函数更改为0。

9 个答案:

答案 0 :(得分:1)

使用第一种方法更常见且(我相信更广泛接受),就好像您要检查多于一个或两个变量一样,您开始获得非常长的行缩进。与第二种方法相比,第一种方法也更简洁。

答案 1 :(得分:1)

我更喜欢第二个因为它的可读性,如果你的要求将来会改变,如果 i2 == o那么你可以轻松地保持它。

答案 2 :(得分:1)

如果您的目标是在第二个参数为RuntimeException时抛出0,则无需执行任何操作。

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

上面的代码会抛出ArithmeticException,从RuntimeException延伸,从而减少了明确抛出RuntimeException的工作。

编辑:由于您问题中的代码段只是一个示例,因此这是更新后的答案。

避免不必要的else会更加清洁和更好,例如在这种情况下,因为else是另一个分支块,如果你真的不会在那里做太多不仅仅是return,没有它,代码会更好。

如果它进入if,它会返回,从而使else无用,如果它没有,那么只需return就足够了所有你需要的从方法返回return

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

答案 3 :(得分:1)

我更喜欢第二种方式,因为它比Sanjay Rajjadi说的更具可读性,

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

但为什么抛出异常?你可以向用户显示警告或消息,要求他插入新的int。

答案 4 :(得分: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);
    }

答案 5 :(得分:0)

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

答案 6 :(得分:0)

无。

如果除数为零,则不必显式地 throw异常java.lang.ArithmeticException

答案 7 :(得分:0)

如果我真的需要,我会使用第一种方法,因为如果检查很多争论,会有大量的缩进。

尽管如此,我不得不说:如果需要这样的检查,请务必评估两次。

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

请参阅this question,了解为何经常夸大支票,尤其是使用空/非空检查。

答案 8 :(得分:0)

使用以下方法。你不需要检查零。只是抛出算术异常。

private int divide( int i1, int i2 ) throws ArithmeticException
{
    return i1/i2;
}