[英]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.