14 Stimmen

Werden Stack Traces erzeugt, wenn eine Java-Ausnahme ausgelöst wird?

Dies setzt voraus, dass wir die Methode .printstacktrace nicht aufrufen, sondern nur werfen und auffangen.

Wir erwägen dies bei einigen Leistungsengpässen.

19voto

perp Punkte 3693

Nein, Stack Traces werden erzeugt, wenn das Ausnahmeobjekt konstruiert wird, nicht wenn es ausgelöst wird. Die Throwable()-Konstruktoren rufen fillInStackTrace() auf. (Zumindest in Sun/Oracle's JDK 6 für Windows.)

9voto

axtavt Punkte 233070

Der Stacktrace wird aufgezeichnet, wenn die Ausnahme konstruiert wird.

Wenn Sie sich wirklich nicht um den Stacktrace kümmern, können Sie eine Ausnahme einmal konstruieren und sie mehrmals auslösen, aber das sieht wie ein Hack aus und kann verwirrend sein.

4voto

stacker Punkte 65961

Ein Throwable-Objekt erfasst den aktuellen Stack (unter Verwendung von nativem Code), ob er gedruckt wird oder nicht. Das ist der Grund, warum Exceptions nicht für den Kontrollfluss (miss)gebraucht werden sollten.

4voto

Brad Cupit Punkte 6350

Er wird nicht erst beim Aufruf der Methode printStackTrace() erstellt

Neal Gafter (ehemaliger Sun-Ingenieur im Team, das Java entwickelt) erwähnte die Ausnahmeleistung aquí :

Der teuerste Teil der Ausnahme Behandlung ist bei weitem die Aufzeichnung des Stack Trace bei der Erzeugung der Ausnahme

Siehe auch diese Frage .

2voto

claude Punkte 89

Wie oben beantwortet, werden keine Stacktraces erzeugt, wenn eine Ausnahme ausgelöst wird. Vielmehr werden sie erzeugt, wenn die Ausnahme konstruiert wird. Ich habe es unten getestet. Meiner Meinung nach ist dies nicht intuitiv. Der Ort, an dem etwas Falsches passiert, ist der Ort, an dem die Ausnahme ausgelöst wird, nicht der, an dem sie konstruiert wird.

class ExceptionNewVsThrow {

    private static RuntimeException instantiateException() {
        return new RuntimeException("Hello");
    }

    private static void test1(Exception exception) throws Exception {
        throw exception;
    }

    public static void main(String[] args) throws Exception {
        Exception exception = instantiateException();
        test1(exception);
    }
}

Und die Ausgabe ist:

Exception in thread "main" java.lang.RuntimeException: Hello
    at FSystem.experimental.exceptions.ExceptionNewVsThrow.instantiateException(ExceptionNewVsThrow.java:18)
    at FSystem.experimental.exceptions.ExceptionNewVsThrow.main(ExceptionNewVsThrow.java:26)

Beachten Sie, dass der Stack-Trace Folgendes erwähnt Haupt y instantiateException , aber nicht test1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X