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)
时间: 2024-09-28 08:05:09

Java异常处理之InvocationTargetException(反射异常)的相关文章

深入理解Java异常处理机制

1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. <span style="background-color: rgb(255, 255, 255

Java异常处理机制的秘密

一.结论 这些结论你可能从未听说过,但其正确性是毋庸置疑的,不妨先看看: 1.catch中throw不一定能抛回到上一层,因为finally中的return会抑制这个throw2.finally中throw一定能抛回上一层,因为此时其后的return不会被执行到(throw中断了正常的顺序流)3.在try/catch中return并不会直接返回上一层,而是先执行finally再返回 二.一段小程序 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

项目中java异常处理

一.java异常类介绍. Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类. 有一篇比较好的blog,http://blog.csdn.net/hguisu/article/details/6155636 介绍java异常. 二.异常处理方式. 在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常. 三.程序中使用. 2种处理方式 1.throw new 异常  在方法体上写throws

java异常处理和设计

在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能.因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给出在进行Java异常处理设计时的几个建议. 若有不正之处,请多多谅解和指正,不胜感激. 请尊重作者劳动成果,转载请标明

Java异常处理 “受控(checked)”的异常

示例程序: public class TestThrows { public static void main(String[] args) { FileInputStream fis = new FileInputStream("a.txt"); } } 为什么以上程序完全符合Java语法规范,但是却会报错呢? 修正: public class TestThrows { public static void main(String[] args) throws FileNotFoun

Java异常处理错误

Java异常处理错误 发现错误的最佳时期是在编译阶段,也就是在你运行程序之前.然而,编译期间并不能找出所有的错误,余下的问题必须在运行阶段解决.这就需要错误源通过某种方式把适当的信息传给某个接收者,该接收者知道如何处理这个问题. Java中的异常处理的目的在于通过使用少于目前数量的代码来简化大型,可靠的程序的生成,并且通过这种方式可以使你更加自信:你的应用中没有未处理的错误. 异常这个词有我对此感到意外的意思.问题出现了,你也许不清楚该如何处理,但你的确知道不该置之不理:你要停下来,看看是不是有

基础知识《十一》Java异常处理总结

Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟

Java 异常处理

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常. 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 这些异常有的是因为用户错误引起,

java异常处理(父子异常的处理)

我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习<Thinking in Java>,我才明白其中的道理,现在我再来温习一下. 一.子类方法只能抛出父类方法的异常或者是其子异常 对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常 package thinkinginjava; public abst