2012-07-12 14 views
16

मैं जावा प्रतिबिंब का उपयोग करके एक विधि का आह्वान करना चाहता हूं।जावा प्रतिबिंब का उपयोग कर अपवाद को फेंकने वाली विधि को कैसे शुरू करें?

समस्या यह है कि यह विधि (जिसे मैंने लिखा) एक अपवाद फेंकता है (मैंने myCustomException बनाया)। जब मैं एक कोशिश/पकड़ खंड जोड़ता हूं, तो मैं अपनी परियोजना नहीं चला सकता, क्योंकि ग्रहण कहता है "पकड़ने का खंड पहुंच योग्य नहीं है"।

यहाँ है जब मैं MyClass कक्षा में MyMethod आह्वान करने के लिए प्रयास करें:

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

जब MyMethod फेंक नहीं है एक MyCustomException, eveything ठीक है।

मान लीजिए कि मैं fooMethod(), जो वर्ग BarClass() में है को लागू करने की कोशिश करते हैं, और:: लेकिन जब यह एक MyCustomException फेंकता है, मैं इस त्रुटि संदेश मिलता है

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 

क्या यह भी संभव है? वैसे भी मदद के लिए धन्यवाद।

+0

ऐसा लगता है कि विधि मंगलाचरण की तरह एक अपवाद फेंक रहा है। कोशिश के साथ इसे चारों ओर घेरो। – Razvan

उत्तर

23

आप इसका कारण प्राप्त कर सकते हैं जो मूल अपवाद होगा।

InvocationTargetException.getCause(); 

प्रलेखन से:

InvocationTargetException एक जाँच अपवाद है कि एक अपवाद एक लागू विधि या निर्माता द्वारा फेंका लपेटता है।

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

अपनी पकड़ ब्लॉक में, आप अगर अपवाद प्रकार आप उम्मीद और इसे संभाल से है जांच कर सकता है।

एक सरल दृष्टिकोण होगा:

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

धन्यवाद! यह काम करता हैं। लेकिन मुझे अपने MyCustomException से संदेश प्राप्त नहीं हो सकता है, 'getCause()। GetMessage()', भले ही मैंने अपना MyCustomException इस तरह बनाया: 'नया MyCustomException ("संदेश") '। – cleroo

+0

मुझे लगता है कि यह आपके विशिष्ट कार्यान्वयन के कारण हो सकता है, क्या आप डीबग कर सकते हैं और जांच सकते हैं कि अपवाद वास्तव में संदेश धारण कर रहा है या नहीं? –

+0

मैं मार्को टॉपोलनिक के रास्ते से सफल रहा। वैसे भी धन्यवाद। – cleroo

1

आप विधि है कि myMethod.invoke(null, myParam) कार्यान्वित में एक catch खंड जोड़ने की कोशिश कर रहे हैं, तो जाहिर है कि नहीं यह कर का सही तरीका है। इस मामले में आप प्रतिबिंब के माध्यम से विधि का आह्वान कर रहे हैं और यह अपवाद को पकड़ने की जगह नहीं है, क्योंकि invoke विधि अन्य अपवादों को फेंकता है। एक बार जब आप अपवाद फेंकने वाली विधि का आह्वान करते हैं, यदि कोई अपवाद है, तो उसे सही ढंग से याद होने पर InvocationTargetException में फेंक दिया जाएगा और लपेटा जाएगा।

InvocationTargetException से संबंधित this explanation का अंतिम भाग देखें।

9

एक तरह से यह करने के लिए:

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

+1 अच्छा दृष्टिकोण;) –

+0

असल में यह काम नहीं करता:: – cleroo

+0

यह काम करता है। यह मेरी गलती थी, मेरे MyCustomException में, कन्स्ट्रक्टर सही ढंग से सेट नहीं किया गया था: मैंने संदेश पास नहीं किया! बेवकूफ त्रुटि – cleroo

संबंधित मुद्दे