отлавливание EmptyStackException против тестирования является пустым стеком - PullRequest
3 голосов
/ 16 июля 2009

У меня есть объект Stack, над которым работают несколько потоков. Один из потоков является рабочим потоком, который выполняет операцию pop над объектом Stack. Я хотел разобраться со случаем, когда стек пуст, и я вижу два варианта

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

OR

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

У меня вопрос: какой из вышеперечисленных является лучшим подходом и почему?

Спасибо!

Ответы [ 6 ]

5 голосов
/ 16 июля 2009

Я думаю, что лучшим подходом было бы проверить, пуст ли стек, как во втором примере.

Ловля исключений обходится дорого!

4 голосов
/ 16 июля 2009

Второй подход будет работать , только если у вас есть только один поток, который может постоянно извлекать объекты из вашего стека.

Если нет, то ваша составная логика не будет работать правильно, даже если сам стек является потокобезопасным, так как другие потоки могут вставлять между вызовом 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 {
        ...
    }
}

Первый подход работает , даже в этом случае, поскольку он использует один атомарный вызов.

4 голосов
/ 16 июля 2009
3 голосов
/ 16 июля 2009

Второй.

Исключения составляют непредвиденные условия программы, а не бизнес-логика.

Могут также быть проблемы с производительностью, если вы используете исключения для всего.

0 голосов
/ 16 июля 2009

Сложно создать исключение. Если этого легко избежать, как в этом случае, почему бы не избежать этого?

Есть хорошая статья O 'Reilly , которая описывает использование исключений. Один ключевой момент (на второй странице).

Никогда не используйте исключения для управления потоком

0 голосов
/ 16 июля 2009

Считается плохой практикой отлавливать исключения для целей выполнения программы. Используйте последний метод.

...