2015-10-27 6 views

risposta

7

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.

+0

Grazie per la risposta completa. Aiuta a spiegare molto, ha funzionato per me. – Busch

0

È possibile utilizzare il metodo newInstance sull'oggetto Class.

+1

Dato 'new exceptionOfTypeExceptionTypePassedIn (newMessage);', penso che stiano cercando di passare un argomento al costruttore. –

+0

Sembra corretto. –

Problemi correlati