我有一个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
{ ...}
我的问题是,上述哪种方法更好,为什么?
谢谢!
答案 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来描述异常的用法。一个关键点(在第二页)。
永远不要使用流量控制的例外