2012-07-12 6 views
16

Ich möchte eine Methode mit Java Reflection aufrufen.Wie ruft man eine Methode auf, die eine Exception mit Java Reflection auslöst?

Das Problem ist, dass diese Methode (die ich schrieb) löst eine Ausnahme (ich erstellte eine myCustomException). Wenn ich eine try/catch-Klausel hinzufüge, kann ich mein Projekt nicht ausführen, weil Eclipse sagt "die catch-Klausel ist nicht erreichbar".

Hier ist, wenn ich versuche myMethod in der Klasse aufzurufen MyClass:

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

Wenn MyMethod wirft kein MyCustomException, eveything in Ordnung ist. Aber wenn es wirft einen MyCustomException, erhalte ich diese Fehlermeldung:

Sagen wir, ich versuche fooMethod aufzurufen(), die BarClass in der Klasse(), und:

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 

Ist es überhaupt möglich? Danke trotzdem für Hilfe.

+0

Es sieht aus wie der Methodenaufruf eine Ausnahme wirft. Umgeben Sie es mit Versuch-Fang. – Razvan

Antwort

23

Sie können die Ursache dafür erhalten, die die ursprüngliche Ausnahme wäre.

InvocationTargetException.getCause(); 

Aus Dokumentation:

InvocationTargetException ist eine geprüfte Ausnahme, die eine Ausnahme von einer aufgerufenen Methode oder Konstruktor geworfene einwickelt.

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

In Ihrem catch-Block, können Sie überprüfen, ob Ausnahme von der Art ist, dass Sie es erwarten und zu handhaben.

Ein einfacher Ansatz wäre:

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

Danke! Es klappt. Aber ich kann die Nachricht aus meiner MyCustomException nicht mit 'getCause(). GetMessage()' erhalten, selbst wenn ich meine MyCustomException wie folgt erstellt habe: 'new MyCustomException (" the message ")'. – cleroo

+0

Ich denke, das könnte an Ihrer spezifischen Implementierung liegen, könnten Sie debuggen und überprüfen, ob die Ausnahme wirklich die Nachricht enthält? –

+0

ist mir mit Marko Topolnik gelungen. Trotzdem danke. – cleroo

1

Wenn Sie eine catch Klausel in dem Verfahren hinzuzufügen versuchen, die myMethod.invoke(null, myParam) ausführt, dann ist das offensichtlich nicht der richtige Weg, es zu tun. In diesem Fall rufen Sie die Methode über Reflektion auf und dies ist nicht der Ort, an dem die Ausnahme abgefangen wird, da die Methode invoke andere Ausnahmen auslöst. Sobald Sie die Methode aufgerufen haben, die die Ausnahme auslöst, wird sie ausgelöst und in eine InvocationTargetException eingeschlossen, wenn es eine Ausnahme gibt, wenn ich mich richtig erinnere.

Überprüfen Sie den letzten Teil von this explanation in Bezug auf die InvocationTargetException.

9

Eine Möglichkeit, dies zu tun:

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

+1 nice approach;) –

+0

In der Tat hat es nicht funktioniert::/ – cleroo

+0

Es funktioniert. Es war mein Fehler, in meiner MyCustomException wurde der Konstruktor nicht richtig gesetzt: Ich habe die Nachricht nicht weitergegeben! Dummer Fehler – cleroo