簡體   English   中英

如何使用Java Reflection調用拋出異常的方法?

[英]How to invoke a method which throws an Exception using Java Reflection?

我想使用Java Reflection調用一個方法。

問題是這個方法(我寫的)拋出一個Exception(我創建了一個myCustomException )。 當我添加一個try / catch子句時,我無法運行我的項目,因為Eclipse說“catch子句無法訪問”。

這是我嘗試在類MyClass中調用myMethod的時候:

270.    myMethod.invoke(null, myParam); // NB : null because myMethod is static

myMethod沒有拋出MyCustomException時 ,eveything就可以了。 但是當它拋出MyCustomException時 ,我收到以下錯誤消息:

比方說,我嘗試調用fooMethod(),這是在類BarClass()和:

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.tests.MyClass.test5(270)
    at com.tests.MyClass.main(297)
Caused by: com.tests.MyCustomException
    at com.tests.barClass.fooMethod(BarClass.java:129)
    ... 6 more

它甚至可能嗎? 無論如何,謝謝你的幫助。

你可以得到它的原因,這將是原始的例外。

InvocationTargetException.getCause();

來自文檔:

InvocationTargetException是一個已檢查的異常,它包裝被調用的方法或構造函數拋出的異常。

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html

在catch塊中,您可以檢查異常是否來自您期望的類型並處理它。

一個簡單的方法是:

try {
   ...
} catch (InvocationTargetException ite) {
   if (ite.getCause() instanceof SomeExceptionType) {
      ...
   } else {
      ...
   }
}

一種方法:

try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}

如果您嘗試在執行myMethod.invoke(null, myParam)的方法中添加catch子句,那么這顯然不是正確的方法。 在這種情況下,您通過反射調用該方法,這不是捕獲異常的地方,因為invoke方法拋出其他異常。 一旦你調用拋出異常的方法,如果有異常,它將被拋出並包裝在InvocationTargetException ,如果我沒記錯的話。

檢查有關InvocationTargetException此解釋的最后部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM