1 回答

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