2009-07-15 5 views
2

Ich habe ein Stack-Objekt, das von mehreren Threads bearbeitet wird. Einer der Threads ist ein Worker-Thread, der eine Popup-Operation für das Stack-Objekt ausführt. Ich wollte den Fall behandeln, wo der Stapel leer ist und ich sehe zwei OptionenErfassen von EmptyStackException vs. Testen ist Stack ist leer

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

ODER

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

Meine Frage ist, welche die oben genannten ist ein besserer Ansatz und warum?

Danke!

Antwort

5

Ich würde denken, dass der bessere Ansatz wäre zu überprüfen, ob der Stapel leer ist, wie in Ihrem zweiten Beispiel.

Das Einfangen von Ausnahmen ist kostspielig!

+2

Ich würde nicht übermäßig über Leistung –

0

Es wird als eine schlechte Methode betrachtet, Ausnahmen für den Programmablauf abzufangen. Verwenden Sie die letztere Methode.

0

Es gibt einen Overhead zum Erstellen der Ausnahme. Wenn es leicht vermeidbar ist, wie es in diesem Fall ist, warum vermeiden Sie es nicht?

Es gibt ein gutes O 'Reilly article hier, das die Verwendung von Ausnahmen beschreibt. Ein wichtiger Punkt (auf der zweiten Seite).

niemals Ausnahmen für die Ablaufsteuerung verwenden

3

Der zweite.

Ausnahmen sind für unerwartete Programmbedingungen und nicht für Geschäftslogik.

Es kann auch zu Leistungsproblemen kommen, wenn Sie Ausnahmen für alles verwenden.

3

Der zweite Ansatz nur haben nur einen Thread, wenn Sie arbeiten würde, die Objekte aus dem Stapel zu allen Zeiten Pop kann.

Wenn nicht, dann funktioniert Ihre Verbundlogik nicht korrekt, obwohl Stack selbst threadsicher ist, da andere Threads zwischen dem Aufruf von empty() und dem Aufruf von pop() schneiden können. Wenn Sie mehr als einen Thread haben, die Objekte aus dem Stapel Pop kann, müssen Sie Folgendes tun:

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

Der erste Ansatz tut Arbeit auch in diesem Fall, da es einen einzigen atomaren Aufruf verwendet.

+0

brilliant machen! Daran habe ich nicht gedacht. Vielen Dank! –