Java异常处理之InvocationTargetException(反射异常)

 Java异常处理之InvocationTargetException(反射异常)

InvocationTargetException异常由Method.invoke(obj, args...)方法抛出。当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收!!!

示例:

  1. package com.zzj.test.reflect;
  2. public class Reflect {
  3. public void run(int i) throws ZeroException {
  4. B b = new B();
  5. b.run(i);
  6. }
  7. }
  8. class B {
  9. public void run(int i) throws ZeroException {
  10. if (i < 0) {
  11. throw new ZeroException("参数不能小于零!");
  12. }
  13. System.out.println("参数:" + i);
  14. }
  15. }
  16. class ZeroException extends Exception {
  17. private static final long serialVersionUID = 1L;
  18. private String detailMessage;
  19. public ZeroException(String detailMessage) {
  20. this.detailMessage = detailMessage;
  21. }
  22. public String getMessage() {
  23. return detailMessage;
  24. }
  25. }

测试:

  1. package com.zzj.test.reflect;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. public class Test {
  5. public static void main(String[] args) {
  6. try {
  7. Class<?> clazz = Class.forName("com.zzj.test.reflect.Reflect");
  8. Method method = clazz.getMethod("run", int.class);
  9. method.invoke(clazz.newInstance(), -1);
  10. } catch (ClassNotFoundException e) {
  11. e.printStackTrace();
  12. } catch (SecurityException e) {
  13. e.printStackTrace();
  14. } catch (NoSuchMethodException e) {
  15. e.printStackTrace();
  16. } catch (IllegalArgumentException e) {
  17. e.printStackTrace();
  18. } catch (IllegalAccessException e) {
  19. e.printStackTrace();
  20. } catch (InvocationTargetException e) {
  21. System.out.println("此处接收被调用方法内部未被捕获的异常");
  22. e.printStackTrace();
  23. } catch (InstantiationException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

输出:

  1. 此处接收被调用方法内部未被捕获的异常
  2. java.lang.reflect.InvocationTargetException
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  5. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  6. at java.lang.reflect.Method.invoke(Unknown Source)
  7. at com.zzj.test.reflect.Test.main(Test.java:11)
  8. Caused by: com.zzj.test.reflect.ZeroException: 参数不能小于零!
  9. at com.zzj.test.reflect.B.run(Reflect.java:13)
  10. at com.zzj.test.reflect.Reflect.run(Reflect.java:6)
  11. ... 5 more

也可以直接打印目标异常:

  1. package com.zzj.test.reflect;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. public class Test {
  5. public static void main(String[] args) {
  6. try {
  7. Class<?> clazz = Class.forName("com.zzj.test.reflect.Reflect");
  8. Method method = clazz.getMethod("run", int.class);
  9. method.invoke(clazz.newInstance(), -1);
  10. } catch (ClassNotFoundException e) {
  11. e.printStackTrace();
  12. } catch (SecurityException e) {
  13. e.printStackTrace();
  14. } catch (NoSuchMethodException e) {
  15. e.printStackTrace();
  16. } catch (IllegalArgumentException e) {
  17. e.printStackTrace();
  18. } catch (IllegalAccessException e) {
  19. e.printStackTrace();
  20. } catch (InvocationTargetException e) {
  21. System.out.println("此处接收被调用方法内部未被捕获的异常");
  22. Throwable t = e.getTargetException();// 获取目标异常
  23. t.printStackTrace();
  24. } catch (InstantiationException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }

输出:

  1. 此处接收被调用方法内部未被捕获的异常
  2. com.zzj.test.reflect.ZeroException: 参数不能小于零!
  3. at com.zzj.test.reflect.B.run(Reflect.java:13)
  4. at com.zzj.test.reflect.Reflect.run(Reflect.java:6)
  5. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  6. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  7. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  8. at java.lang.reflect.Method.invoke(Unknown Source)
  9. at com.zzj.test.reflect.Test.main(Test.java:11)
上一篇:javascript 与jquery为每个p标签增加onclick方法


下一篇:C# 9.0 新特性预览 - 类型推导的 new