3 回答

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
InvocationTargetException異常由Method.invoke(obj, args...)方法拋出。當(dāng)被調(diào)用的方法的內(nèi)部拋出了異常而沒(méi)有被捕獲時(shí),將由此異常接收。
示例:
package com.zzj.test.reflect;
public class Reflect {
public void run(int i) throws ZeroException {
B b = new B();
b.run(i);
}
}
class B {
public void run(int i) throws ZeroException {
if (i < 0) {
throw new ZeroException("參數(shù)不能小于零!");
}
System.out.println("參數(shù):" + i);
}
}
class ZeroException extends Exception {
private static final long serialVersionUID = 1L;
private String detailMessage;
public ZeroException(String detailMessage) {
this.detailMessage = detailMessage;
}
public String getMessage() {
return detailMessage;
}
}
測(cè)試:
package com.zzj.test.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("com.zzj.test.reflect.Reflect");
Method method = clazz.getMethod("run", int.class);
method.invoke(clazz.newInstance(), -1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
System.out.println("此處接收被調(diào)用方法內(nèi)部未被捕獲的異常");
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
輸出:
此處接收被調(diào)用方法內(nèi)部未被捕獲的異常
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.zzj.test.reflect.Test.main(Test.java:11)
Caused by: com.zzj.test.reflect.ZeroException: 參數(shù)不能小于零!
at com.zzj.test.reflect.B.run(Reflect.java:13)
at com.zzj.test.reflect.Reflect.run(Reflect.java:6)
... 5 more
也可以直接打印目標(biāo)異常:
package com.zzj.test.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("com.zzj.test.reflect.Reflect");
Method method = clazz.getMethod("run", int.class);
method.invoke(clazz.newInstance(), -1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
System.out.println("此處接收被調(diào)用方法內(nèi)部未被捕獲的異常");
Throwable t = e.getTargetException();// 獲取目標(biāo)異常
t.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
輸出:
此處接收被調(diào)用方法內(nèi)部未被捕獲的異常
com.zzj.test.reflect.ZeroException: 參數(shù)不能小于零!
at com.zzj.test.reflect.B.run(Reflect.java:13)
at com.zzj.test.reflect.Reflect.run(Reflect.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.zzj.test.reflect.Test.main(Test.java:11)

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
java.lang.reflec.InvocationTargetException
捕獲這個(gè)異常,然后通過(guò)getTargetException() 方法獲得異常,這個(gè)可以獲得原方法拋出的異常。
然后可以通過(guò)類型判斷,判斷到底拋出的是原異常的哪一個(gè)異常。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
Class<?>[]getExceptionTypes()
返回 Class 對(duì)象的數(shù)組,這些對(duì)象描述了聲明將此 Method 對(duì)象表示的底層方法拋出的異常類型。Method對(duì)象通過(guò)該方法可以的到方法聲明時(shí)異常拋出的類型,可以手工判斷進(jìn)行拋出,但是有一點(diǎn)給注意,如果在運(yùn)行時(shí)拋出異常 如 RuntimeException類型的錯(cuò)誤,如果再聲明里沒(méi)有寫明,應(yīng)該領(lǐng)去處理。
添加回答
舉報(bào)