2015-10-27 125 views

回答

7

首先,throw聲明僅適用於參考表達式Throwable或其子類型。因此,您傳遞給您的表達式必須具有該類型。您可以通過爲參數exceptionType提供一個界限來實現此目的。

private void myFunc(Class<? extends Throwable> exceptionType) { 

如果你現在想限制Throwable亞型的類型,你可以做到這一點。

如果是Exception,你需要一個throws聲明

private void myFunc(Class<? extends Exception> exceptionType) throws Exception { 

如果是RuntimeException,也不會

private void myFunc(Class<? extends RuntimeException> exceptionType) { 

取決於你需要什麼,你實際上可能使該方法一般。然後,它看起來像這樣

private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T { 

至於實際的反射邏輯,你這是對應的類型有哪些接受String參數的構造函數訪問的假設。如果沒有,Java會拋出各種各樣的異常。你需要處理這些。

一個潛在的解決方案是這樣的(javadocClass#getConstructorjavadocConstructor#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 
    } 
} 

可以很明顯的摺疊所有這些異常類型爲多catch語句。

請注意,如果您通過的例外類型是現有的catch語句中提到的例外類型之一,它將被吞下,即。不拋出。您也可以將所有這些添加到自己的throws聲明中。

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); 
} 

或重新拋出包含在RuntimeException中的捕獲異常。

+0

感謝您的徹底解答。幫助解釋了很多,爲我工作。 – Busch

0

您可以在Class對象上使用newInstance方法。

+1

鑑於'new exceptionOfTypeExceptionTypePassedIn(newMessage);',我認爲他們正在嘗試將參數傳遞給構造函數。 –

+0

這似乎是正確的。 –