Frage

Ich weiß

throw new Exception();

hat einen ziemlich großen Overhead, da sie eine vollständige stacktrace schafft usw.
Does

throw new Throwable();

präsentieren das gleiche Problem? Ist dieses Verhalten geerbt oder nicht werfen ein Throwable hat einen kleineren (o no) Overhead?

Bearbeiten
Von einer Analyst Sicht ein Benutzer ein falsches Kennwort Einfügen ist eine Ausnahme von der normalen Reihenfolge der Ausführung eines Programms. Also, wenn ich:

public Session newSession() {  
  validate_user_and_password();   
}

ein UserNotValidException werfen würde klingen richtig von einem Analysten Sicht.
Wiederkehrende null oder 0 klingt einfach falsch, wenn Ihr Code ziemlich gut Abstraktion hat. Ich wollte nur wissen, ob ich tatsächlich diese im Code implementieren könnte, oder wenn ich würde es verlassen, nur um Theorie.

Es gibt einen guten Unterschied zwischen Programmier-Point-of-View-Ausnahme und Analytiker-Point-of-View-Ausnahme.

Hinweis: Ich habe ein wirklich einfaches und dummes Beispiel gegeben haben, das ist nicht ganz mein Fall
. Anmerkung 2:. Ich weiß null Rückkehr würde die normale Sache sein, aber ich bin haben erforderlich richtig abstrahiert und OO-Code, und ich persönlich keinen Schaden in dieser sehe

War es hilfreich?

Lösung

Throwable schafft auch einen Stacktrace, wenn es erstellt wird. Aus der Java Dokumentation für Throwable :

  

throwable enthält eine Momentaufnahme des Ausführungsstapels ihres Gewinde zum Zeitpunkt sie erstellt wurde.

So in Bezug auf Overhead in Bezug auf einen Stacktrace zu schaffen, sollte es kein Unterschied zwischen Exception und Throwable sein.

Wenn Sie Ausnahmen für „außergewöhnliche Ereignisse“ verwenden (wie Sie sein sollte), dann sollten Sie nicht werden, um mit den Overhead eines Stacktrace besorgt. Ein außergewöhnliches Ereignis tritt selten Code in ausgeführt wird. So Ausnahmen sollten nicht die Leistung des normalen Code in irgendeiner signifikanten Weise auswirken.

Andere Tipps

Nein, müssen Sie Ihre eigene Unterklasse diesen Effekt zu vermeiden.

Exception ex = new Exception() {
    @Override public Throwable fillInStackTrace() {
        return this; // and do nothing else
    }
};

Dies erzeugt eine Instanz der Ausnahme, dass der Stack-Trace nicht füllen wird (die Schaffung von Ausnahmen Delegierten fillInStackTrace, um tatsächlich den Stack-Trace zu füllen) und ist somit günstig zu erstellen.

Mit JIT-Kompilierung ist es eigentlich immer noch nicht der Fall, dass es eine Menge belauscht ist ein Exception in Java zu werfen. Aber ein Throwable werfen ist nicht viel anders, da man dort einen Stack-Trace auch bekommen.

Wenn Sie interessiert sind, gibt es eine sehr interessante Arbeit "Effiziente Java Exception Handling in Just-in-Time-Kompilierung" ( link ). Kein Licht lesen, aber sehr informativ.

Sie sollten niemals werfen oder fangen Throwable. Der Umfang der Ausnahme ist viel zu groß.

Wie bereits erwähnt, sollten Ausnahmen nur verwendet werden, wenn erforderlich, das heißt: in Ausnahmefällen und sollen spezifisch auf die Situation, die sie hervorgebracht hat. Davon abgesehen, impliziert eine Vielzahl von Ausnahmen, wie Throwable einen OutOfMemoryException zu kontrollieren. Ein Fehler in dieser Größenordnung kann nicht von (leicht) wiedergefunden wird und soll nicht vom Entwickler behandelt werden.

Throwable ist Elternklasse von Exception. so Exception class von Throwable geerbt.

Throwable vs. Exception

Java Exception

Wie @mangoDrunk sagte: "Throwable ist die Super Ausnahme und Irrtum."

Sie können auf den Quellcode der beiden Klassen suchen, die Exception alles tun, nicht die gleichen Konstrukteurs wie Throwable . All das Fleisch und damit Aufwand, lebt in Throwable.

Auch wenn Exception einigen zusätzlichen Aufwand einführen hat es eine klare Überoptimierung zu nutzen Throwable stattdessen wäre. Verwenden Sie das richtige Werkzeug für den Job, nicht kooptieren das falsche Werkzeug, nur weil es leichter ist.

java.lang.Exception erstreckt java.lang.Throwable, so dass es die gleiche Overhead ist. Von der Javadoc :

  

Die Throwable-Klasse ist die Superklasse aller Fehler und Ausnahmen in der Programmiersprache Java. Nur Objekte, die Instanzen dieser Klasse (oder einer ihrer Unterklassen) sind durch die Java Virtual Machine geworfen oder kann von der Java-throw-Anweisung geworfen werden. In ähnlicher Weise nur diese Klasse oder einer ihrer Unterklassen kann das Argument Typ in einer catch-Klausel sein.

     

Instanzen von zwei Unterklassen, Fehler- und Exception, werden üblicherweise verwendet, um anzuzeigen, dass Ausnahmesituationen aufgetreten sind. Typischerweise werden frisch diese Fälle im Rahmen der Ausnahmesituation geschaffen, um relevante Informationen (wie Stack-Trace-Daten) enthält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top