Ich habe die folgende Situation.
Ich habe eine Java-Klasse, die von einer anderen Basisklasse erbt und eine Methode überschreibt. Die Basismethode löst keine Ausnahmen aus und hat daher keine throws ...
Deklaration.
Jetzt sollte meine eigene Methode in der Lage sein, Ausnahmen auszulösen, aber ich habe entweder die Wahl dazu
- Schluck die Ausnahme
- Fügen Sie eine Wurfdeklaration hinzu
Beides ist nicht zufriedenstellend, da das erste die Ausnahme stillschweigend ignorieren würde (ok, ich könnte eine Protokollierung durchführen) und das zweite aufgrund der unterschiedlichen Methodenheader Compilerfehler erzeugen würde.
public class ChildClass extends BaseClass {
@Override
public void SomeMethod() {
throw new Exception("Something went wrong");
}
}
quelle
Hier ist ein Trick:
class Utils { @SuppressWarnings("unchecked") private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T { throw (T) exception; } public static void throwException(Throwable exception) { Utils.<RuntimeException>throwException(exception, null); } } public class Test { public static void main(String[] args) { Utils.throwException(new Exception("This is an exception!")); } }
quelle
throws
Deklarationen zuzuweisen.Eine dritte Möglichkeit besteht darin, die Ausnahmeprüfung zu deaktivieren (genau wie es die Standard-API manchmal tun muss) und die geprüfte Ausnahme in Folgendes zu verpacken
RuntimeException
:throw new RuntimeException(originalException);
Möglicherweise möchten Sie eine spezifischere Unterklasse von verwenden
RuntimeException
.quelle
Ich möchte nur eine alternative Antwort hinzufügen, nur als FYI :
Ja, es gibt eine Möglichkeit
throws
, mithilfe dersun.misc.Unsafe
Klasse eine aktivierte Ausnahme auszulösen, ohne die Deklaration hinzuzufügen . Dies wird im folgenden Blogbeitrag beschrieben:Wirf eine aktivierte Ausnahme aus einer Methode aus, ohne sie zu deklarieren
Beispielcode:
public void someMethod() { //throw a checked exception without adding a "throws" getUnsafe().throwException(new IOException()); } private Unsafe getUnsafe() { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); return (Unsafe) field.get(null); } catch (Exception e) { throw new RuntimeException(e); } }
Dies wird jedoch nicht empfohlen. Es ist besser, eine ungeprüfte Ausnahme einzuschließen, wie in einigen anderen Antworten beschrieben.
quelle
Unsafe
.Warum werfen Sie keine ungeprüfte Ausnahme? Dies muss nicht deklariert werden.
Zwei Alternativen sind
final
und der Compiler weiß, welche überprüften Ausnahmen Sie möglicherweise abgefangen haben.Letzteres ist nützlicher, wenn Sie eine Prüfausnahme in Ihrem Code auslösen und in Ihrem aufrufenden Code abfangen, die dazwischen liegenden Ebenen jedoch nichts über die Ausnahme wissen.
quelle
Ja, es gibt ein Warum, aber es wird überhaupt nicht empfohlen, was Sie verwenden können:
getUnsafe().throwException(new IOException());
Diese Methode löst eine geprüfte Ausnahme aus, aber Ihr Code muss sie nicht abfangen oder erneut auslösen. Genau wie zur Laufzeitausnahme.
quelle
Hier ist ein Beispiel für das Abfangen aktivierter Ausnahmen und das Umschließen dieser in eine nicht aktivierte Ausnahme:
public void someMethod() { try { doEvil(); } catch (IOException e) { throw new RuntimeException(e); } }
quelle
Sie können die Ausnahme mit dem try-catch-Block in Ihrer überschriebenen Methode abfangen. dann müssen Sie keine throws- Anweisung deklarieren.
quelle
Sie können jede von RuntimeException oder RuntimeException selbst abgeleitete Ausnahme verwenden
oder
Verwenden Sie einen Try-Block für den Code zum Auslösen von Ausnahmen und behandeln Sie ihn dort
quelle