
Michael
Das ist wahrscheinlich eine sehr naive Frage.
Früher habe ich geglaubt, dass a Throwable
auf Java stets enthält den Stacktrace. Ist es richtig?
Jetzt sieht es so aus, dass ich Ausnahmen fange ohne der Stack-Trace. Macht das Sinn? Ist es möglich um eine Ausnahme ohne Stack-Trace abzufangen?

Alex W
Es ist möglich, ein Throwable-Objekt in Java ohne Stacktrace abzufangen:
Throwable(String message, Throwable cause, boolean enableSuppression,boolean writableStackTrace)
Erstellt ein neues Throwable mit der angegebenen Detailmeldung, Ursache, Unterdrückung aktiviert oder deaktiviert und
Beschreibbarer Stack-Trace aktiviert oder deaktiviert.
public Throwable fillInStackTrace()
Füllt den Ausführungsstack-Trace aus. Diese Methode zeichnet in diesem Throwable-Objekt Informationen über den aktuellen Zustand der Stack-Frames für den aktuellen Thread auf.
Wenn der Stack-Trace dieses Throwable nicht beschreibbar ist, hat der Aufruf dieser Methode keine Auswirkung.
http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html

manikanta
Für Java6:
Da Java 6 das nicht hat Throwable(String message, Throwable cause, boolean enableSuppression,boolean writableStackTrace)
Konstruktor können wir das Füllen des Stacktrace mit der folgenden Technik unterdrücken (von Scala entlehnt, erfuhr ich von Wie langsam sind Java-Ausnahmen?).
class NoStackTraceRuntimeException extends RuntimeException {
@Override
public synchronized Throwable fillInStackTrace() {
return this;
}
}
Verwendung ist gleich: throw new NoStackTraceRuntimeException ()
oder seine Subtypen.
Dasselbe können wir auch tun, indem wir verlängern Throwable
:
class NoStackTraceThrowable extends Throwable {
@Override
public synchronized Throwable fillInStackTrace() {
return this;
}
}
Aber ein kleiner Haken ist, dass Sie nicht mehr können catch
diese Ausnahme mit Exception
da dies kein Untertyp von ist Exception
sollte stattdessen fangen NoStackTraceThrowable
oder es ist Untertypen.
Aktualisieren: Einige interessante Statistiken zur Leistung in verschiedenen Anwendungsfällen finden Sie in dieser SO-Frage

Deron
Für Java 7+ ist hier ein Beispiel für eine Ausnahme, bei der der Stack-Trace optional unterdrückt werden kann.
public class SuppressableStacktraceException extends Exception {
private boolean suppressStacktrace = false;
public SuppressableStacktraceException(String message, boolean suppressStacktrace) {
super(message, null, suppressStacktrace, !suppressStacktrace);
this.suppressStacktrace = suppressStacktrace;
}
@Override
public String toString() {
if (suppressStacktrace) {
return getLocalizedMessage();
} else {
return super.toString();
}
}
}
Dies kann demonstriert werden mit:
try {
throw new SuppressableStacktraceException("Not suppressed", false);
} catch (SuppressableStacktraceException e) {
e.printStackTrace();
}
try {
throw new SuppressableStacktraceException("Suppressed", true);
} catch (SuppressableStacktraceException e) {
e.printStackTrace();
}
Dies basiert auf der MLContextException von Apache SystemMLdessen Code auf GitHub unter verfügbar ist https://github.com/apache/systemml.

Stefan Isele – prefabware.com
Der einfachste Weg, den Stacktrace bei jeder Ausnahme zu unterdrücken, ist
throwable.setStackTrace(new StackTraceElement[0]);
Wenn die Ausnahme eine Ursache hat, müssen Sie möglicherweise rekursiv dasselbe tun.
Dadurch wird auch die aufwendige Erstellung des Stack-Trace so weit wie möglich reduziert
Der Stacktrace für ein Throwable wird in initialisiert
Throwable#fillInStackTrace()
, die von jedem Konstruktor aufgerufen wird und daher nicht vermieden werden kann. Wenn der Stacktrace tatsächlich verwendet wird, ist ein StackTraceElement[] ist faul eingebaut
Throwable#getOurStackTrace()
was nur passiert, wenn das Feld Throwable.stackTrace nicht bereits gesetzt wurde.
Durch Festlegen des Stacktrace auf einen beliebigen Nicht-Nullwert wird die Konstruktion des StackTraceElement vermieden[] in Throwable#getOurStackTrace() und reduziert die Leistungseinbußen so weit wie möglich.
Wie in der Antwort von NG. angedeutet, wenn Sie zuerst den Stacktrace sehen, dann aber für dieselbe Ausnahme verschwindet, sehen Sie höchstwahrscheinlich die Auswirkungen der JVM-Optimierung. In diesem Fall sind die folgenden Fragen sehr ähnlich.
Wiederkehrende Ausnahme ohne Stack-Trace – wie zurücksetzen?
NullPointerException in Java ohne StackTrace
Sie können diese JVM-Funktion deaktivieren, aber ich würde empfehlen, sie aktiviert zu lassen und daran zu arbeiten, den Fehler von vornherein zu verhindern, oder ihn abzufangen und eleganter zu handhaben.
10194000cookie-checkAusnahme ohne Stacktrace in Javayes
Welche JVM? Umfeld? usw. Hilft das? stackoverflow.com/questions/4659151/…
– N.G.
11. Juli 2012 um 14:07 Uhr
@SB. Ja, das hilft. Danke vielmals. Ich habe ein sehr ähnliches Problem: Ich habe viele Ausnahmen (NPE). Methode
error
vonlog4j
protokolliert einige Ausnahmen ohne der Stack-Trace.– Michael
11. Juli 2012 um 14:25 Uhr