捕获EmptyStackException与Testing是否为空

时间:2009-07-15 20:16:58

标签: java exception-handling stack

我有一个Stack对象正由多个线程处理。其中一个线程是一个工作线程,它对Stack对象执行pop操作。我想处理堆栈为空的情况,我看到两个选项

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

OR

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

我的问题是,上述哪种方法更好,为什么?

谢谢!

6 个答案:

答案 0 :(得分:5)

我认为更好的方法是检查堆栈是否为空,如第二个示例所示。

捕获异常代价高昂!

答案 1 :(得分:4)

答案 2 :(得分:4)

第二种方法只有>只有一个线程可以随时从堆栈中弹出对象时才会工作

如果没有,那么即使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 {
        ...
    }
}

即使在这种情况下,第一种方法也会工作,因为它使用单个原子调用。

答案 3 :(得分:3)

第二个。

异常是针对意外的程序条件而非业务逻辑。

如果您对所有内容使用例外,则可能还会出现性能问题。

答案 4 :(得分:0)

为了程序流的目的,捕获异常被认为是一种不好的做法。使用后一种方法。

答案 5 :(得分:0)

创建Exception会产生开销。如果它很容易避免,就像在这种情况下,为什么不避免呢?

这里有一个很好的O 'Reilly article来描述异常的用法。一个关键点(在第二页)。

  

永远不要使用流量控制的例外