603 Stimmen

Unfangbare ChuckNorrisException

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 .

8voto

Hans-Peter Störr Punkte 24030

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

6voto

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

6voto

Thomas Eding Punkte 33018

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.

3voto

Jay Punkte 3148

Sie können ChuckNorris intern oder privat halten und ihn einkapseln oder ihm folgen...

try { doChuckAction(); } catch(ChuckNorrisException cne) { /*do something else*/ }

3voto

supercat Punkte 72939

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.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