Ist es möglich, einen Codeschnipsel zu konstruieren in Java Das würde eine hypothetische java.lang.ChuckNorrisException
uneinholbar?
Denkbar wären zum Beispiel die Verwendung von Abfangjägern oder aspektorientierte Programmierung .
Ist es möglich, einen Codeschnipsel zu konstruieren in Java Das würde eine hypothetische java.lang.ChuckNorrisException
uneinholbar?
Denkbar wären zum Beispiel die Verwendung von Abfangjägern oder aspektorientierte Programmierung .
Eine Variante des Themas ist die überraschende Tatsache, dass Sie nicht deklarierte geprüfte Ausnahmen in Java-Code auslösen können. Da sie nicht in der Methodensignatur deklariert ist, lässt der Compiler Sie die Ausnahme selbst nicht abfangen, obwohl Sie sie als java.lang.Exception abfangen können.
Hier ist eine Hilfsklasse, mit der Sie alles werfen können, ob deklariert oder nicht:
public class SneakyThrow {
public static RuntimeException sneak(Throwable t) {
throw SneakyThrow.<RuntimeException> throwGivenThrowable(t);
}
private static <T extends Throwable> RuntimeException throwGivenThrowable(Throwable t) throws T {
throw (T) t;
}
}
Jetzt throw SneakyThrow.sneak(new ChuckNorrisException());
löst eine ChuckNorrisException aus, aber der Compiler beschwert sich in
try {
throw SneakyThrow.sneak(new ChuckNorrisException());
} catch (ChuckNorrisException e) {
}
über das Abfangen einer Ausnahme, die ich
Die einzige ChuckNorrisException
s in Java sollte sein OutOfMemoryError
y StackOverflowError
.
Man kann sie tatsächlich auf die Art und Weise "fangen", wie ein catch(OutOfMemoryError ex)
wird ausgeführt, wenn die Ausnahme ausgelöst wird, aber dieser Block wirft die Ausnahme automatisch an den Aufrufer zurück.
Ich glaube nicht, dass public class ChuckNorrisError extends Error
funktioniert, aber Sie können es ja mal ausprobieren. Ich habe keine Dokumentation über die Erweiterung von Error
Is it possible to construct a snippet of code in java that would make a hypothetical java.lang.ChuckNorrisException uncatchable?
Ja, und hier ist die Antwort: Gestalten Sie Ihre java.lang.ChuckNorrisException
so, dass es nicht ein Fall von java.lang.Throwable
. Und warum? Ein nicht auswerfbares Objekt ist per Definition nicht fangbar, weil man etwas, das nicht geworfen werden kann, auch nicht fangen kann.
Zwei grundlegende Probleme bei der Behandlung von Ausnahmen in Java sind, dass der Typ einer Ausnahme verwendet wird, um anzuzeigen, ob eine Aktion auf der Grundlage dieser Ausnahme durchgeführt werden sollte, und dass alles, was eine Aktion auf der Grundlage einer Ausnahme durchführt (d.h. sie "abfängt"), die zugrundeliegende Bedingung beheben soll. Es wäre nützlich, ein Mittel zur Verfügung zu haben, mit dem ein Ausnahmeobjekt entscheiden könnte, welche Handler ausgeführt werden sollen und ob die Handler, die bisher ausgeführt wurden, die Dinge so weit bereinigt haben, dass die aktuelle Methode ihre Exit-Bedingungen erfüllen kann. Während dies verwendet werden könnte, um "unfangbare" Ausnahmen zu machen, wären zwei größere Verwendungen, um (1) Ausnahmen zu machen, die nur dann als behandelt gelten, wenn sie von einem Code abgefangen werden, der tatsächlich weiß, wie man mit ihnen umgeht, und (2) eine sinnvolle Behandlung von Ausnahmen zu ermöglichen, die in einer finally
Block (wenn ein FooException
während einer finally
Block während des Abwickelns einer BarException
Beide Ausnahmen sollten sich auf dem Aufrufstapel nach oben ausbreiten; beide sollten abfangbar sein, aber die Abspulung sollte fortgesetzt werden, bis beide abgefangen worden sind). Leider glaube ich nicht, dass es eine Möglichkeit gibt, bestehenden Code für die Behandlung von Ausnahmen so zu gestalten, ohne etwas kaputt zu machen.
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.