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)

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

  1. Java反射异常处理之InvocationTargetException

    java.lang.reflect.InvocationTargetException处理办法可能是没有引commons-lang3-3.x.jar包

  2. 札记:Java异常处理

    异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...

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

    我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么 ...

  4. Java 异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out ...

  5. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  6. JAVA 异常处理机制

    主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...

  7. Java异常处理和设计

    在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...

  8. 深入理解java异常处理机制

       异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...

  9. Java提高篇——Java 异常处理

    异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...

随机推荐

  1. Markdown 使用教程

    前言 以前经常在 github 中看到 .md 格式的文件,一直没有注意,也不明白为什么文本文档的后缀不是 .txt ,后来无意中看到了 Markdown,看到了用这个东西写得一些web界面等特别的规 ...

  2. Debian 8 设置时区和时间配置

    一.设置时区 1. 执行 tzselect 2. 弹出洲级地域选项: Please identify a location so that time zone rules can be set cor ...

  3. hashCode方法

    hashCode方法: 当覆写(override)了equals()方法之后,必须也覆写hashCode()方法,反之亦然.这个方法返回一个整型值(hash code value),如果两个对象被eq ...

  4. git概念及工作流程详解

    git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别 ...

  5. node 的安装

    安装方法来自于 https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager Note: ...

  6. Shell脚本大量示例

     Shell基础之控制流结构 一.控制结构 几乎所有的脚本里都有某种流控制结构,很少有例外.流控制是什么?假定有一个脚本,包含下列几个命令: #!/bin/sh # make a directory ...

  7. centos chroot使用

    chroot命令用来在指定的根目录下运行指令.chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以/,即是以根 (r ...

  8. [Windows Azure] Windows Azure SQL Database library

    Microsoft Windows Azure SQL Database extends SQL Server capabilities to the cloud. SQL Database offe ...

  9. GBDT 迭代决策树

    GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决 ...

  10. docker之创建MariaDB镜像的方法

    一.基于commit命令方式创建 docker的安装 ? 1 2 3 [root@test01 ~]# yum install docker [root@test01 ~]# systemctl en ...