Java 反射 - 反射调用时的包装异常(InvocationTargetException)
·
反射调用时的包装异常
1、基本介绍
- 通过反射调用方法 → 方法内部抛异常 → 反射框架捕获并包装成 InvocationTargetException → 其
getCause()才是真正的异常
2、演示
public class Demo {
public void problematicMethod() {
int result = 10 / 0;
}
public void checkedExceptionMethod() throws Exception {
throw new Exception("业务异常");
}
}
try {
Class<?> clazz = Class.forName("com.reflection.Demo");
Constructor<?> constructor = clazz.getDeclaredConstructor();
Object instance = constructor.newInstance();
Method method = clazz.getMethod("problematicMethod");
method.invoke(instance);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
System.err.println("外层异常: " + e.getClass().getSimpleName());
System.err.println(e.getMessage());
System.err.println("真实原因: " + e.getCause());
e.getCause().printStackTrace();
}
# 输出结果
外层异常: InvocationTargetException
null
真实原因: java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
try {
Class<?> clazz = Class.forName("com.reflection.Demo");
Constructor<?> constructor = clazz.getDeclaredConstructor();
Object instance = constructor.newInstance();
Method method = clazz.getMethod("checkedExceptionMethod");
method.invoke(instance);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
System.err.println("外层异常: " + e.getClass().getSimpleName());
System.err.println(e.getMessage());
System.err.println("真实原因: " + e.getCause());
e.getCause().printStackTrace();
}
# 输出结果
外层异常: InvocationTargetException
null
真实原因: java.lang.Exception: 业务异常
java.lang.Exception: 业务异常
更多推荐


所有评论(0)