2021/04/06

[筆記] Effective Java #69 只針對異常的情況下才使用異常

Effective Java 3rd 簡體中文版筆記 #69 只針對異常的情況下才使用異常
如果有段程式碼利用異常來中斷 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

沒有留言:

張貼留言