Erstens funktioniert die throw
-Anweisung nur mit den Referenzausdrücken Throwable
oder ihren Subtypen. Daher muss der Ausdruck, den Sie an Ihre throw
übergeben, diesen Typ haben. Sie können dies erreichen, indem Sie eine Grenze für den Parameter exceptionType
angeben.
private void myFunc(Class<? extends Throwable> exceptionType) {
Wenn Sie jetzt die Art von Throwable
Subtyp einschränken möchten, können Sie das auch tun.
Wenn es Exception
ist, müssen Sie eine throws
Erklärung
private void myFunc(Class<? extends Exception> exceptionType) throws Exception {
Wenn es RuntimeException
ist, wird es nicht
private void myFunc(Class<? extends RuntimeException> exceptionType) {
Je nachdem, was Sie brauchen, könnten Sie eigentlich die Methode generisch machen . Es würde sich dann wie folgt
private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T {
Was die tatsächliche Reflexionslogik, können Sie die Annahme machen, dass die entsprechende Art einen zugänglichen Konstruktor hat, der eine String
Argument akzeptiert. Wenn dies nicht der Fall ist, wird Java alle möglichen Ausnahmen selbst auslösen. Sie müssen damit umgehen.
Eine mögliche Lösung würde so aussehen (javadoc für Class#getConstructor
, javadoc für Constructor#newInstance
)
private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T {
final String message = "some message";
try {
throw exceptionType.getConstructor(String.class).newInstance(message);
} catch (InstantiationException e) {
e.printStackTrace();
// rethrow
} catch (IllegalAccessException e) {
e.printStackTrace();
// rethrow
} catch (IllegalArgumentException e) {
e.printStackTrace();
// rethrow
} catch (InvocationTargetException e) {
e.printStackTrace();
// rethrow
} catch (NoSuchMethodException e) {
e.printStackTrace();
// rethrow
} catch (SecurityException e) {
e.printStackTrace();
// rethrow
}
}
Sie offensichtlich alle diese Ausnahmetypen in eine Multi-catch-Anweisung kollabieren kann.
Beachten Sie, dass, wenn die Ausnahme-Art, die Sie übergeben haben, eine der in den bestehenden catch
Aussagen wurde, wird es geschluckt werden, dh. nicht geworfen. Sie können auch alle diese in einer eigenen throws
Deklaration hinzufügen.
private static <T extends Throwable> void myFunc(Class<T> exceptionType) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, T {
final String message = "some message";
throw exceptionType.getConstructor(String.class).newInstance(message);
}
oder die gefangenen Ausnahmen in einem RuntimeException
gewickelten erneut auslösen.
Danke für die gründliche Antwort. Hilft viel zu erklären, hat für mich gearbeitet. – Busch