2009-07-15 75 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