InvocationTargetException 异常是在 java.lang.reflect 包中, 所以该异常的产生和反射有关.
- package org.simpleit.test;
- public class Calculator {
- public int div(int i, int j){
- return i / j;
- }
- }
- package org.simpleit.test;
- public class TestCalculator {
- public void testDiv(Calculator calculator, Integer a, Integer b){
- System.out.println(calculator.div(a, b));
- }
- }
- @SuppressWarnings("unchecked")
- @Test
- public void testInvocationTargetException() throws Exception{
- TestCalculator testCalculator = new TestCalculator();
- Calculator calculator = new Calculator();
- Class clazz = TestCalculator.class;
- Method testDiv = clazz.getDeclaredMethod("testDiv", Calculator.class,
- Integer.class, Integer.class);
- //以下代码会抛出 InvocationTargetException 异常
- testDiv.invoke(testCalculator, calculator, 12, 0);
- }
testDiv.invoke(testCalculator, calculator, 12, 0); 行代码会抛出 InvocationTargetException 异常, 但若直接
testCalculator.testDiv(calculator, 12, 0); 则抛出的却是 java.lang.ArithmeticException 异常.
结论: 在利用 Method 对象的 invoke 方法调用目标对象的方法时, 若在目标对象的方法内部抛出异常, 会抛出 InvocationTargetException 异常, 该异常包装了目标对象的方法内部抛出异常, 可以通过调用 InvocationTargetException 异常类的的 getTargetException() 方法得到原始的异常.