1 回答

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