In primo luogo, l'istruzione throw
funziona solo con espressioni di riferimento di Throwable
o dei suoi sottotipi. Pertanto, l'espressione che passi al tuo throw
deve avere quel tipo. È possibile ottenere ciò, fornendo un limite per il parametro exceptionType
.
private void myFunc(Class<? extends Throwable> exceptionType) {
Se ora si vuole limitare il tipo di Throwable
sottotipo, si può fare anche questo.
Se è Exception
, avrete bisogno di un throws
dichiarazione
private void myFunc(Class<? extends Exception> exceptionType) throws Exception {
Se è RuntimeException
, non lo farà
private void myFunc(Class<? extends RuntimeException> exceptionType) {
A seconda di che cosa avete bisogno, si potrebbe effettivamente rendere il metodo generico . Sarebbe quindi simile a questa
private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T {
Per quanto riguarda la logica riflessione attuale, si stanno facendo l'ipotesi che il tipo corrispondente ha un costruttore accessibile che accetta un argomento String
. In caso contrario, Java genererà ogni sorta di eccezioni. Devi gestirli.
Una possibile soluzione sarebbe simile a questa (javadoc per Class#getConstructor
, javadoc per 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
}
}
ovviamente è possibile comprimere tutti i tipi di eccezione in una dichiarazione di multi-catch.
Nota che se il tipo di eccezione che hai inoltrato era uno di quelli menzionati nelle attuali dichiarazioni catch
, sarà ingoiato, cioè. non gettato. È anche possibile aggiungere tutti quelli in una dichiarazione throws
propria.
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);
}
o rigenerare le eccezioni catturati avvolto in un RuntimeException
.
Grazie per la risposta completa. Aiuta a spiegare molto, ha funzionato per me. – Busch