Java.lang.reflect.InvocationTargetException क्या कारण हो सकता है?


313

खैर, मैंने इसे समझने और पढ़ने की कोशिश की है कि यह क्या कारण हो सकता है लेकिन मैं इसे प्राप्त नहीं कर सकता:

मेरे पास मेरे कोड में यह कहीं है:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

बात यह है कि, जब यह कुछ विधि को लागू करने की कोशिश करता है तो यह InvocationTargetExceptionकुछ अन्य अपेक्षित अपवाद (विशेष रूप से ArrayIndexOutOfBoundsException) के बजाय फेंकता है । जैसा कि मुझे वास्तव में पता है कि किस विधि को लागू किया जाता है, मैं सीधे इस विधि कोड में गया और लाइन के लिए एक ट्राइ-कैच ब्लॉक जोड़ा जो कि फेंकने के लिए लगता है ArrayIndexOutOfBoundsExceptionऔर यह वास्तव ArrayIndexOutOfBoundsExceptionमें अपेक्षित रूप से फेंक दिया । फिर भी जब यह ऊपर जा रहा है तो ई InvocationTargetExceptionके ऊपर और कोड में किसी तरह बदल जाता catch(Exception e)है InvocationTargetExceptionऔर ArrayIndexOutOfBoundsException अपेक्षा के अनुरूप नहीं है।

इस तरह के व्यवहार का क्या कारण हो सकता है या मैं इस तरह की जांच कैसे कर सकता हूं?

जवाबों:


333

आपने प्रतिबिंब के साथ विधि को कॉल करके अमूर्तता का एक अतिरिक्त स्तर जोड़ा है। प्रतिबिंब परत किसी भी अपवाद को लपेटती है InvocationTargetException, जो आपको प्रतिबिंब कॉल में विफलता के कारण वास्तव में अपवाद के बीच का अंतर बताती है (शायद आपकी तर्क सूची मान्य नहीं थी, उदाहरण के लिए) और विधि के भीतर विफलता।

बस के भीतर कारण खोलना InvocationTargetExceptionऔर आप मूल एक करने के लिए मिल जाएगा।


4
@ user550413: अपवाद को उजागर करके और निश्चित रूप से इसकी जांच करना। आप हमेशा इसे खुद फेंक सकते हैं, और इसे इस तरह से पकड़ सकते हैं कि अगर आपको चाहिए।
जॉन स्कीट

157
किसी के बारे में यह सोचकर कि इसका अर्थ क्या है "इस कारण को उजागर न करें InvocationTargetException", मैंने अभी पता लगाया है कि यदि आपने इसका उपयोग करके प्रिंट किया है exception.printStackTrace(), तो आप शीर्ष आधे / सामान्य अनुभाग के बजाय "कारण द्वारा:" अनुभाग देखें।
Jan

31
"अलिखित" के बारे में स्पष्टीकरण को जोड़ने के लिए आप अपवाद भी पकड़ सकते हैं और उस पर getCause () विधि का उपयोग कर सकते हैं, जिसे यदि वांछित हो, तो पुनर्विचार भी किया जा सकता है। try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }...catch... { throw ex.getCause() }
jcadcell

4
+1 @ हंजन के लिए you just look at the "Caused By:" section instead of the top half/normal section
जिंजरहेड

1
@DheraajBhaskar अन्य लोगों के उत्तरों को संपादित न करें क्योंकि वे आपके खुद के थे, और पाठ के लिए उद्धरण स्वरूपण का उपयोग नहीं करते हैं जो उद्धृत किए गए हैं। उस संपादन को एक टिप्पणी के रूप में पोस्ट किया जाना चाहिए था।
लोरेन

51

अपवाद फेंक दिया जाता है अगर

InvocationTargetException - यदि अंतर्निहित विधि एक अपवाद फेंकता है।

इसलिए यदि विधि, जिसे प्रतिबिंब एपीआई के साथ लागू किया गया है, एक अपवाद (उदाहरण के लिए रनटाइम अपवाद) फेंकता है, प्रतिबिंब एपीआई अपवाद को एक में लपेट देगा InvocationTargetException


महान व्याख्या!
गौरव ३०'१

क्या होगा अगर मैं एक अपवाद को फेंकने के लिए अंतर्निहित विधि की अपेक्षा करता हूं? क्या मुझे इस अपवाद को पकड़ना चाहिए और केवल पुनर्विचार करना चाहिए?
jDub9


21

Method.invoke () के Javadoc से

फेंकता है: InvocationTargetException - यदि अंतर्निहित विधि एक अपवाद फेंकता है।

इस अपवाद को फेंक दिया जाता है यदि विधि को अपवाद कहा जाता है।


तो कल्पना कीजिए कि मेरे पास java.lang.reflect.Proxyएक लिपटे ऑब्जेक्ट को बढ़ाने वाले उदाहरणों का एक झरना है । प्रत्येक Proxyकृपापूर्वक अपने स्वयं के उपयोग से एक विशिष्ट अपवाद (संभवतः लिपटे हुए ऑब्जेक्ट द्वारा फेंका गया) को संभालता है InvocationHandler। इस कैस्केड के माध्यम से रिपल के अपवाद के लिए जब तक कि सही मंगलाचरण हैंडलर / प्रॉक्सी तक नहीं पहुंचता, प्रत्येक में InvocationHandler, मैं इसे पकड़ता हूं InvocationTargetException, यह जांचना चाहिए कि क्या लिपटे अपवाद एक अपवाद है जो instanceofइसके द्वारा नियंत्रित किया जाना है InvocationHandler। यदि यह नहीं है instanceof, तो मैं अपरिवर्तित अपवाद को फेंक दूंगा ... सही?
अब्दुल

मैं हमेशा अलिखित अपवाद को फेंक दूंगा।
पीटर लॉरी

9

यह InvocationTargetExceptionसंभवतः आपके ऊपर लपेट रहा है ArrayIndexOutOfBoundsException। प्रतिबिंब का उपयोग करते समय कोई भी अपफ्रंट नहीं होता है जो उस विधि को फेंक सकता है - इसलिए एक throws Exceptionदृष्टिकोण का उपयोग करने के बजाय , सभी अपवादों को पकड़ा और अंदर लपेटा जा रहा है InvocationTargetException


धन्यवाद, लेकिन यह कि मैं उदाहरण के लिए (AssertionError e) और (अपवाद e) के बीच कैसे अंतर करूँगा? अगर मुझे हमेशा इन्वोकेशनटार्गटेक्स्टैप्शन मिलता है तो पहले उस कारण को उजागर करना होगा जहां मैं प्रत्येक अपवाद के बीच भिन्न होऊंगा?
user550413

9

यह विशिष्ट विधि में कोड की सटीक रेखा को प्रिंट करेगा, जो कि आह्वान करने पर, अपवाद को उठाया:

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}

1
धन्यवाद; इससे मुझे यह महसूस करने में मदद मिली कि मेरा मुद्दा स्वयं प्रतिबिंब में नहीं था, बल्कि आह्वान विधि के भीतर था।
जोस गोमेज़

3

यह कुछ इस तरह का वर्णन करता है,

InvocationTargetException एक जाँच अपवाद है जो एक आह्वान विधि या कंस्ट्रक्टर द्वारा फेंके गए अपवाद को लपेटता है। रिलीज 1.4 के रूप में, इस अपवाद को सामान्य प्रयोजन अपवाद-चेनिंग तंत्र के अनुरूप बनाया गया है। "लक्ष्य अपवाद" जो निर्माण के समय प्रदान किया जाता है और getTargetException () विधि के माध्यम से एक्सेस किया जाता है, जिसे अब कारण के रूप में जाना जाता है, और इसे Throwable.getCause () विधि, साथ ही उपरोक्त विधि "विरासत विधि" के माध्यम से एक्सेस किया जा सकता है।


2

आप इस तरह से getCause () पद्धति का उपयोग करके मूल अपवाद वर्ग के साथ तुलना कर सकते हैं:

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 

1

मेरे पास / a / block के अंदर java.lang.reflect.InvocationTargetExceptionबाहरी में लकड़हारा वस्तु को कॉल करने वाले स्टेटमेंट से एक त्रुटि हुई थी ।classtrycatchclass

ग्रहण डिबगर में कोड के माध्यम से कदम रखना और लकड़हारा बयान पर माउस को मँडराते हुए मैंने देखा कि लकड़हारा objectथा null(कुछ बाहरी स्थिरांक को मेरे बहुत ऊपर से तात्कालिक होने की आवश्यकता थी class)।


0

इस अपवाद को फेंक दिया जाता है अगर अंतर्निहित विधि (परावर्तन का उपयोग करके बुलाया जाने वाला तरीका) एक अपवाद को फेंकता है।

इसलिए, यदि विधि, जिसे प्रतिबिंब एपीआई द्वारा आमंत्रित किया गया है, एक अपवाद (उदाहरण के लिए रनटाइम अपवाद) फेंकता है, प्रतिबिंब एपीआई अपवाद को एक InvocationTargetException में लपेट देगा।


0

मैं उसी समस्या का सामना कर रहा था। मैंने e.getCause () का उपयोग किया। getCause () तब मैंने पाया कि यह गलत मापदंडों के कारण था जो मैं गुजर रहा था। किसी एक पैरामीटर का मान लाने में nullPointerException थी। आशा है कि यह आपकी मदद करेगा।


-2
  1. ग्रहण नेविगेटर मोड से सभी जार फ़ाइलों को सूचीबद्ध करें
  2. सत्यापित करें कि सभी जार फाइलें बाइनरी मोड में हैं

4
नेविगेटर में देखने से आप वास्तव में जार फाइलों को बाइनरी मोड में कैसे सत्यापित करते हैं?
विलियम

@William तुमने मुझे हंसा दिया। इस आदमी का जवाब नीचा होना चाहिए।
करीम मनाउल

-7

मेरे द्वारा क्लीन-> रन xDoclet-> रन xPackaging करने के बाद त्रुटि गायब हो गई।

मेरे कार्यक्षेत्र में, इक्लिप्स में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.