赞
踩
笔者前些日子做过一个这样的事情,利用反射机制调用一个会报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改写代码日志,日志需要记录报错的具体行数以及具体信息,用栈去跟踪的话,层数太多,反而会使得运行效率降低。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。