如果有段程式碼利用異常來中斷 while 迴圈,這是不對的作法,異常的設計是用於不正常的情形,在正常的控制情況下不應該使用它。另外,這樣的寫法並不會讓程式執行速度更快。
try {
int i = 0;
while(true)
range[i++].climb();
} catch (ArrayIndexOutOfBoundsException e) {
}
for (Mountain m : range)
m.climb();
這條原則與設計 API 也有關,設計良好的 API 不應該讓調用者因為要有正常的流程而去控制異常,換句話說,不應該有依賴異常來控制流程的情形發生。API 設計者知道在某種異常下,要去對程式的狀態作改變時,就應提供一個方法 (狀態測試方法) 告訴調用者,目前是否已進入該狀態。for(Iterator<Foo> i = collection.iterator(); i.hasNext(); ) {
Foo foo = i.next();
...
}
// No hasNext() method
try {
Iterator<Foo> i = collection.iterator();
while(true) {
Foo foo = i.next();
...
}
} catch(NoSuchElementException e) {
}
以 iterator 來說,如果沒有 hasNext 方法時,那麼在使用 next 方法時就必須去接住異常,這樣會增加調用者負擔,而且容易使人誤解,或者當真正發生異常時卻沒有將異常拋出,導致無法處理,而上述的 hasNext 就是屬於狀態測試方法。轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2021/03/effective-java-69-exceptional-condition.html
沒有留言:
張貼留言