簡體   English   中英

在運行方法之前檢查參數的最佳方法

[英]Best way to check arguments before running method

所以,例如,如果我有一個名為“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。

使用第一種方法更常見並且(我相信更廣泛接受),就好像您正在檢查多於一個或兩個變量一樣,您開始獲得非常長的行縮進。 與第二種方法相比,第一種方法也更簡潔。

我更喜歡第二個因為它的可讀性,如果你的要求在未來改變,就像i2 == o那么你可以輕松地保持它。

如果您的目標是在第二個參數為0時拋出RuntimeException ,則無需執行任何操作。

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;
}

我更喜歡第二種方式,因為它比Sanjay Rajjadi說的更具可讀性,

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

但為什么拋出異常? 你可以向用戶顯示警告或消息,要求他插入新的int。

就個人而言,我不喜歡它們,因為拋出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);
    }
private int divide(int i1, int i2) throws IllegalArgumentException{
    if(i2==0)
    throw new IllegalArgumentException("Argument 'divisor' is 0");
    else return i1/i2;
}

沒有。

您不必顯式 throw該異常,如果除數為零,則拋出java.lang.ArithmeticException

如果我真的需要,我會使用第一種方法,因為如果檢查許多爭論,將會得到大量的縮進。

不過我不得不說:如果需要這樣的檢查,總是評估兩次。

在您的特定情況下,檢查是多余的,因為除以0將拋出ArithmeticException它將說: / by zero

請參閱此問題,以獲得一個很好的解釋,為什么經常誇大檢查,特別是使用null / not null檢查。

使用以下方法。 你不需要檢查零。 只是拋出算術異常。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM