2015-10-27 9 views

Antwort

7

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.

+0

Danke für die gründliche Antwort. Hilft viel zu erklären, hat für mich gearbeitet. – Busch

0

Sie konnten die newInstance Methode auf dem Class-Objekt verwenden.

+1

Bei 'neue exceptionOfTypeExceptionTypePassedIn (newMessage);', ich denke, sie versuchen, ein Argument für den Konstruktor zu übergeben. –

+0

Das scheint richtig zu sein. –

Verwandte Themen