2009-07-15 74 views
2

我有一個正在由多個線程工作的堆棧對象。其中一個線程是一個對Stack對象執行彈出操作的工作線程。我想處理堆棧的空的情況下,我看到兩個選項捕捉EmptyStackException與測試是堆棧是空的

try{ 
    Object obj = (Object) d_stackObj.pop(); 
    } 
catch (EmptyStackException e) 
    { ...} 

OR

if(! d_stackObj.empty()) 
    Object obj = (Object) d_stackObj.pop(); 
else 
    { ...} 

我的問題是,它的上面是一個更好的辦法,爲什麼?

謝謝!

回答

5

我認爲更好的方法是檢查堆棧是否爲空,如第二個示例中所示。

捕捉異常是昂貴的!

+2

我不會過分擔心表演 – 2009-07-15 20:25:31

0

爲了程序流程的目的,捕獲異常被認爲是不好的做法。使用後一種方法。

0

創建異常會產生開銷。如果它很容易避免,就像在這種情況下一樣,爲什麼不避免呢?

這裏有一個很好的O 'Reilly article,它描述了異常的用法。一個關鍵點(在第二頁)。

決不使用異常流量控制

3

第二。

例外是針對意外的程序條件,而不是業務邏輯。

如果您對所有內容使用異常,則可能還存在性能問題。

3

第二種方法是有效的只有你只有一個線程可以從您的堆棧在任何時候都彈出對象。

如果不是,那麼即使Stack自身是線程安全的,因爲其他線程可能會在empty()調用和pop()調用之間切片,您的複合邏輯將無法正常工作。如果你有一個以上的線程可以從你的棧中彈出的對象,你可能需要做到以下幾點:

synchronized (d_stackObj) { // you must use the stack object as the lock 
    if (!d_stackObj.empty()) { 
     Object obj = (Object)d_stackObj.pop(); 
    } else { 
     ... 
    } 
} 

第一種方法確實,即使在這種情況下的工作,因爲它使用單個原子的呼叫。

+0

輝煌!我沒有想到這一點。謝謝! – 2009-07-16 11:34:25