我正在尝试创建一个函数,该函数根据您传入的类型抛出异常。
private void myFunc(Class<?> exceptionType) {
...do some work...
throw new exceptionOfTypeExceptionTypePassedIn(newMessage);
}
你能这样做吗?
答案 0 :(得分:7)
首先,throw
语句仅适用于Throwable
或其子类型的引用表达式。因此,传递给throw
的表达式必须具有该类型。您可以通过为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将抛出自己的各种异常。你需要处理这些。
潜在的解决方案如下所示(Class#getConstructor
为javadoc,Constructor#newInstance
为javadoc
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
语句中提到的异常类型之一,则会吞下它,即。没有抛出。您还可以在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
中包含的已捕获异常。
答案 1 :(得分:0)
您可以在newInstance
对象上使用Class
方法。
答案 2 :(得分:0)
反射非常混乱。可接受的答案有效,但是您的代码将很难遵循。为了避免这种情况,最好重构代码。