[JAVA]运用反射机制,抛出的异常的捕获方法

背景介绍

笔者前些日子做过一个这样的事情,利用反射机制调用一个会报Checked的异常的方法,在调用后没法抛出异常(原因是反射机制调用是没法catch到Checked异常的)。举个简单的例子如下。
1.先定义一个简单的异常类(这样的定义是Checked的异常哦)

package com.zju.study.exception;

public class SimpleException extends Exception {
    private static final long serialVersionUID = 1L;
    private String Message;

    public SimpleException(String message) {
        this.setMessage(message);
    }

    public String getMessage() {
        return Message;
    }

    public void setMessage(String message) {
        Message = message;
    }
}

2.定义一个实体类Man

package com.zju.study.exception;

public class Man {
    private String work;

    public String getWork() {
        return work;
    }

    public void setWork(String work) throws SimpleException {
        this.work = work;
        System.out.println(work);
        throw new SimpleException("man is died");
    }

}

3.最后定义Main方法。

package com.zju.study.exception;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        Method method = null;
        try {
            method = Man.class.getMethod("setWork", String.class);
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
        Man man = new Man();
        try {
            method.invoke(man, "man is hard working");
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            e.printStackTrace();
        }

    }
}

OK~~运行之,结果如下。

man is hard working
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.zju.study.exception.Main.main(Main.java:16)
Caused by: com.zju.study.exception.SimpleException: man is died
    at com.zju.study.exception.Man.setWork(Man.java:13)
    ... 5 more

这个时候的需求是!!!在invoke方法调用抛出的异常在Main中被捕获,那该如何去做呢?

大多数人可能和我一样,觉得这种问题很简单,加个catch语句呗。。如下。

catch (SimpleException e) {
            e.printStackTrace();
        }

结果,报错了!!!如下。

Unreachable catch block for SimpleException. This exception is never thrown from the try statement body

这里我们给出解决办法如下。
一个重要的方法,getCause()方法。具体代码如下。

package com.zju.study.exception;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        Method method = null;
        try {
            method = Man.class.getMethod("setWork", String.class);
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
        Man man = new Man();
        try {
            method.invoke(man, "man is hard working");
        } catch (SimpleException e) {
            e.printStackTrace();
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            Throwable cause = e.getCause();
            if(cause instanceof SimpleException){
                System.out.println("ok,we catch SimpleException:"+(SimpleException)cause);
            }

        }

    }
}

运行结果如下。

man is hard working
ok,we catch SimpleException:com.zju.study.exception.SimpleException: man is died

总结:异常中2个很重要的异常,CheckedException和RuntimeException应该能够分清楚他们之间的区别!!!另外,反射机制请慎用,特别在对于日志要求极高的项目中,反射机制可能一不小心就会打印出你不想要的日志信息(本人亲身经历,使用Spring AOP改写代码日志,日志需要记录报错的具体行数以及具体信息,用栈去跟踪的话,层数太多,反而会使得运行效率降低。)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值