我想創建一個拋出基於您在傳遞類型異常的函數。如何拋出通過反射創建的Exception類的實例?
private void myFunc(Class<?> exceptionType) {
...do some work...
throw new exceptionOfTypeExceptionTypePassedIn(newMessage);
}
你能做到這一點?
我想創建一個拋出基於您在傳遞類型異常的函數。如何拋出通過反射創建的Exception類的實例?
private void myFunc(Class<?> exceptionType) {
...do some work...
throw new exceptionOfTypeExceptionTypePassedIn(newMessage);
}
你能做到這一點?
首先,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會拋出各種各樣的異常。你需要處理這些。
一個潛在的解決方案是這樣的(javadoc爲Class#getConstructor
,javadoc爲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
}
}
可以很明顯的摺疊所有這些異常類型爲多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
中的捕獲異常。
您可以在Class
對象上使用newInstance
方法。
鑑於'new exceptionOfTypeExceptionTypePassedIn(newMessage);',我認爲他們正在嘗試將參數傳遞給構造函數。 –
這似乎是正確的。 –
感謝您的徹底解答。幫助解釋了很多,爲我工作。 – Busch