1 回答

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
當(dāng)發(fā)生錯(cuò)誤時(shí),代碼立即跳出。
在您的代碼中,您正在做的事情在某些情況下會導(dǎo)致錯(cuò)誤(例如,如果數(shù)組變量沒有指向任何內(nèi)容(為空),或者它是否為空數(shù)組),然后您檢查這些條件,毫無意義。
這就像先過馬路,然后檢查是否有汽車駛來。您要么在檢查交通情況之前就已經(jīng)遇到路障,要么如果您已經(jīng)安全地過馬路,檢查現(xiàn)在就沒有意義了。
所以,換個(gè)角度吧。
具體來說,這段代碼:int min = values[0];
將拋出NullPointerExceptionif valuesis null,并將拋出ArrayIndexOutOfBoundsExceptionif valuesis an empty array。
更一般地說,這個(gè):
catch (Exception e) {
e.printStackTrace();
}
是非常糟糕的代碼。對于初學(xué)者來說,這意味著代碼會在錯(cuò)誤發(fā)生后繼續(xù)運(yùn)行,因此通常您的日志中會充滿大量錯(cuò)誤消息,即使有一件事情出錯(cuò)了,更重要的是,異常包含 5 個(gè)有用的信息:它的類型、它的消息、它的堆棧跟蹤、它的因果鏈和附加到它的一批被抑制的異常。
最后一個(gè)通常不是特別有趣,但其他 4 個(gè)非常有用。你扔掉了 4 個(gè)有用的東西中的 3 個(gè),只打印堆棧跟蹤。除此之外,你還在到處重復(fù)這種風(fēng)格的代碼。
所以不要。
永遠(yuǎn)不要編寫捕獲異常的代碼只是為了記錄或打印它。只是.. 不要抓住它,讓頂級異常處理程序(它打印所有有用的信息然后關(guān)閉線程,這是一個(gè)很好的默認(rèn)設(shè)置)處理它。如果是已檢查異常,則添加throws X到方法簽名中,其中 X 是已檢查異常。例如:
好的代碼:
public void deleteFile(String fileName) throws IOException {
Files.delete(Paths.get(fileName));
}
錯(cuò)誤代碼:
public void deleteFile(String fileName) {
try {
Files.delete(Paths.get(fileName));
} catch (IOException e) {
System.err.println("Something went wrong deleting file!");
e.printStackTrace();
}
}
第二段代碼:
打印無用信息(“出了點(diǎn)問題”,是的,我知道,我正在查看異常)
使用糟糕的風(fēng)格;感嘆號在錯(cuò)誤消息中沒有用。
代碼靜默繼續(xù),因此任何調(diào)用此方法的代碼都無法判斷刪除是否失敗。也可能會出現(xiàn)更多錯(cuò)誤
丟棄大量信息;IOException 可能有一條消息,例如“文件被標(biāo)記為只讀”,您現(xiàn)在已經(jīng)將其丟棄。
更長
這只是它出了什么問題的一個(gè)例子。
添加回答
舉報(bào)