NoSuchMethodError
मेरा जावा प्रोग्राम चलाते समय एक त्रुटि हो रही है । क्या गलत है और मैं इसे कैसे ठीक करूं?
NoSuchMethodError
मेरा जावा प्रोग्राम चलाते समय एक त्रुटि हो रही है । क्या गलत है और मैं इसे कैसे ठीक करूं?
जवाबों:
किसी भी अधिक जानकारी के बिना समस्या को इंगित करना मुश्किल है, लेकिन मूल कारण यह है कि आपने सबसे अधिक संभावना वर्ग के एक अलग संस्करण के खिलाफ एक वर्ग को संकलित किया है जो एक विधि को याद कर रहा है, जिसे आप इसे चलाते समय उपयोग कर रहे हैं।
स्टैक ट्रेस देखें ... यदि लायब्रेरी में किसी ऑब्जेक्ट पर किसी विधि को कॉल करते समय अपवाद दिखाई देता है, तो आप कंपाइलिंग और चलाने के दौरान लाइब्रेरी के अलग-अलग संस्करणों का उपयोग करने की संभावना रखते हैं। सुनिश्चित करें कि आपके पास दोनों जगहों पर सही संस्करण है।
यदि आपके द्वारा बनाई गई कक्षाओं द्वारा तात्कालिक रूप से वस्तुओं पर एक विधि को कॉल करने पर अपवाद दिखाई देता है, तो आपकी निर्माण प्रक्रिया दोषपूर्ण लगती है। सुनिश्चित करें कि जब आप संकलित कर रहे हैं तो वास्तव में चल रही कक्षा की फाइलें अपडेट की जाती हैं।
Caused by
स्टैक ट्रेस में अंतिम अनुभाग की जांच करता हूं ताकि अपराधी वर्ग / जार का पता लगाया जा सके
मुझे आपकी समस्या हो रही थी, और यह है कि मैंने इसे कैसे तय किया। पुस्तकालय को जोड़ने के लिए निम्न चरण एक कार्य तरीका है। मैंने पहले दो चरणों को सही किया था, लेकिन मैंने अपने ग्रहण प्रोजेक्ट पर "lib" फ़ोल्डर में फ़ाइल सिस्टम से सीधे ".jar" फ़ाइल को खींचकर अंतिम एक नहीं किया था। इसके अतिरिक्त, मुझे लाइब्रेरी के पिछले संस्करण को बिल्ड पथ और "लिब" दोनों फ़ोल्डर से निकालना था।
ध्यान दें कि प्रतिबिंब के मामले में, आपको एक मिलता है NoSuchMethodException
, जबकि गैर-चिंतनशील कोड के साथ, आपको मिलता है NoSuchMethodError
। जब मैं एक दूसरे के साथ सामना करता हूं तो मैं बहुत अलग-अलग जगहों पर देखता हूं।
यदि आपके पास जेवीएम मापदंडों को बदलने की पहुंच है, तो वर्बोज़ आउटपुट को जोड़ने से आपको यह देखने की अनुमति मिल सकती है कि कौन सी कक्षाएं किस JAR फ़ाइलों से लोड की जा रही हैं।
java -verbose:class <other args>
जब आपका कार्यक्रम चलाया जाता है, तो JVM को मानक जानकारी से बाहर फेंक देना चाहिए जैसे:
...
[भरा हुआ junit.framework.As File से:: / C: /Program%20Files/junit3.8.2/junit.jar]
...
यह आमतौर पर अपाचे चींटी जैसी बिल्ड सिस्टम का उपयोग करने के कारण होता है जो जावा फाइल को केवल तब संकलित करता है जब जावा फाइल क्लास फाइल की तुलना में नई होती है। यदि एक विधि हस्ताक्षर में परिवर्तन और कक्षाएं पुराने संस्करण की चीजों का उपयोग कर रही थीं, तो उन्हें सही तरीके से संकलित नहीं किया जा सकता है। सामान्य सुधार एक पूर्ण पुनर्निर्माण करना है (आमतौर पर "चींटी साफ" फिर "चींटी")।
कभी-कभी यह एक पुस्तकालय के एक संस्करण के खिलाफ संकलन करते समय भी हो सकता है लेकिन एक अलग संस्करण के खिलाफ चल रहा है।
यदि मावेन या किसी अन्य ढांचे का उपयोग किया जाता है , और आपको यह त्रुटि लगभग अनियमित रूप से मिलती है, तो जैसे एक साफ इंस्टॉल करने का प्रयास करें ...
clean install
यह विशेष रूप से काम करने की संभावना है यदि आपने वस्तु लिखी है और आप जानते हैं कि इसकी विधि है। मेरे लिए काम किया।
यह प्रतिबिंब का उपयोग करने का परिणाम भी हो सकता है। यदि आपके पास एक कोड है जो एक वर्ग को दर्शाता है और नाम से एक विधि निकालता है (जैसे: साथ Class.getDeclaredMethod("someMethodName", .....)
) तो किसी भी समय उस विधि का नाम बदल जाता है, जैसे कि एक रिफलेक्टर के दौरान, आपको मापदंडों को मैच करने के लिए प्रतिबिंब विधि से अपडेट करने के लिए याद रखना होगा नई विधि हस्ताक्षर, या getDeclaredMethod
कॉल एक फेंक देंगेNoSuchMethodException
।
यदि यह कारण है, तो स्टैक ट्रेस को उस बिंदु को दिखाना चाहिए जो प्रतिबिंब विधि को लागू किया गया है, और आपको वास्तविक विधि हस्ताक्षर से मिलान करने के लिए बस मापदंडों को अपडेट करना होगा।
मेरे अनुभव में, यह कभी-कभार आता है जब यूनिट निजी तरीकों / क्षेत्रों का परीक्षण कर रही है, और TestUtilities
परीक्षण सत्यापन के लिए फ़ील्ड निकालने के लिए एक वर्ग का उपयोग कर रही है । (आम तौर पर विरासत कोड के साथ जिसे इकाई परीक्षण को ध्यान में रखकर नहीं बनाया गया था।)
यदि आप एक webapp लिख रहे हैं, तो सुनिश्चित करें कि आपके कंटेनर के वैश्विक पुस्तकालय निर्देशिका में जार के परस्पर विरोधी संस्करण नहीं हैं और आपके ऐप में भी। आप जरूरी नहीं जान सकते हैं कि क्लास लोडर द्वारा किस जार का उपयोग किया जा रहा है।
जैसे
ये समस्याएं समान दो वर्गों में एक ही वस्तु के उपयोग के कारण होती हैं। उपयोग की गई वस्तुओं में नई विधि शामिल नहीं है कि नई वस्तु वर्ग शामिल है।
उदाहरण के लिए:
filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) )
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
at gateway.smpp.USSDClient.bind(USSDClient.java:139)
at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
at gateway.USSDGW.<init>(USSDGW.java:184)
at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)
-bash-3.00$
ये समस्याएँ सहवर्ती 02 समान वर्ग (src में 1, 1 जार फ़ाइल में यहाँ गेटवे है।) के कारण होती हैं।
इसका मतलब है कि संबंधित विधि कक्षा में मौजूद नहीं है:
मैंने अपने ग्रहण को पुनः आरंभ करके और प्रशंसा को चलाकर इस त्रुटि को हल कर दिया है। मेरे मामले का कारण हो सकता है क्योंकि मैं अपने प्रोजेक्ट या एक्लिप्स को बंद किए बिना अपने स्रोत फ़ाइलों को बदल देता हूं। जिसके कारण मैं विभिन्न वर्गों का उपयोग कर रहा था।
इस तरह से प्रयास करें: अपने प्रोजेक्ट निर्देशिकाओं के तहत सभी .class फ़ाइलों को हटा दें (और, निश्चित रूप से, सभी उपनिर्देशिकाएं)। पुनर्निर्माण।
कभी-कभी mvn clean
(यदि आप मावेन का उपयोग कर रहे हैं) मैन्युअल रूप से निर्मित .class फ़ाइलों को साफ नहीं करता है javac
। और उन पुरानी फाइलों में पुराने हस्ताक्षर शामिल हैं, जिसके कारण NoSuchMethodError
।
बस मौजूदा उत्तरों को जोड़ना। मैं इस मुद्दे को ग्रहण में टॉमकैट के साथ सामना कर रहा था। मैंने एक वर्ग बदला था और निम्नलिखित कदम उठाए थे,
साफ किया और eclpise में परियोजना का निर्माण किया
mvan साफ स्थापित
फिर भी मैं उसी त्रुटि का सामना कर रहा था। फिर मैंने टोमैट को साफ किया, टोमैट को काम करने वाली डायरेक्टरी को साफ किया और सर्वर को रिस्टार्ट किया और मेरा इश्यू चला गया। आशा है कि यह किसी की मदद करता है
मूल प्रश्न का उत्तर देने के लिए। यहाँ जावा डॉक्स के अनुसार :
"NoSuchMethodError" यदि कोई एप्लिकेशन वर्ग (या तो स्थिर या उदाहरण) की निर्दिष्ट विधि को कॉल करने का प्रयास करता है, और उस वर्ग की अब उस पद्धति की परिभाषा नहीं है।
आम तौर पर, यह त्रुटि संकलक द्वारा पकड़ी जाती है; यह त्रुटि केवल रन के समय में हो सकती है यदि किसी वर्ग की परिभाषा असंगत रूप से बदल गई हो।
मैंने एक जुनिट टेस्ट फ़ाइल का नाम बदलकर एक्लिप्स में इस समस्या को ठीक किया।
मेरे ग्रहण कार्य स्थान में मेरे पास एक ऐप प्रोजेक्ट और एक टेस्ट प्रोजेक्ट है।
टेस्ट प्रोजेक्ट में बिल्ड पथ पर आवश्यक प्रोजेक्ट के रूप में ऐप प्रोजेक्ट है।
NoSuchMethodError प्राप्त करना शुरू किया।
तब मुझे एहसास हुआ कि टेस्ट प्रोजेक्ट में क्लास का भी वही नाम था जो ऐप प्रोजेक्ट में क्लास का था।
App/
src/
com.example/
Projection.java
Test/
src/
com.example/
Projection.java
सही नाम "प्रोजेक्शनटेस्टवा" का नाम बदलने के बाद अपवाद दूर चला गया।
मेरे पास एक ही त्रुटि थी:
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object;)V
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)
इसे हल करने के लिए मैंने जाँच की, सबसे पहले, मॉड्यूल निर्भरता आरेख ( click in your POM the combination -> Ctrl+Alt+Shift+U
या right click in your POM -> Maven -> Show dependencies
) यह समझने के लिए कि वास्तव में पुस्तकालयों (Intelij IDEA) के बीच संघर्ष कहाँ था। मेरे विशेष मामले में, मेरे पास जैक्सन निर्भरता के विभिन्न संस्करण थे।
1) तो, मैंने सीधे प्रोजेक्ट के अपने पोम में स्पष्ट रूप से उच्चतम संस्करण जोड़ा - इन दोनों का 2.8.7।
गुणों में:
<jackson.version>2.8.7</jackson.version>
और निर्भरता के रूप में:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
2) लेकिन यह भी निर्भरता बहिष्करण का उपयोग करके हल किया जा सकता है ।
नीचे उदाहरण के रूप में एक ही सिद्धांत द्वारा:
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
अवांछित संस्करण के साथ निर्भरता को आपकी परियोजना से बाहर रखा जाएगा।
मेरे मामले में मेरे पास एक मल्टी मॉड्यूल प्रोजेक्ट था और परिदृश्य मॉड्यूल की तरह com.xyz.TestClass
था A
और साथ ही मॉड्यूल B
और मॉड्यूल मॉड्यूल A
पर निर्भर था B
। अतः असेंबली जार बनाते समय मुझे लगता है कि क्लास का केवल एक ही संस्करण बरकरार रखा गया था, अगर उसके पास इनवाइटेड विधि नहीं है, तो मुझे मिल रहा थाNoSuchMethodError
रनटाइम अपवाद , लेकिन संकलन ठीक था।
उपरोक्त उत्तर बहुत अच्छी तरह से समझाता है .. एक बात जोड़ने के लिए यदि आप ग्रहण का उपयोग कर रहे हैं ctrl + shift + T का उपयोग कर रहे हैं और कक्षा की पैकेज संरचना दर्ज करें (जैसे: Gateway.smpp.PDUEventListener), तो आपको सभी जार / परियोजनाएँ मिलेंगी जहाँ यह मौजूद है । क्लासपैथ से अनावश्यक जार निकालें या क्लास पथ में ऊपर जोड़ें। अब यह सही उठाएगा।
मैं इसी तरह के मुद्दे पर भाग गया।
Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I
अंत में मैंने पहचाना कि मूल कारण डेटा प्रकार के परिवर्तनशील है।
Employee.java
-> इसमें वैरिएबल शामिल है ( EmpId
) जिसका डेटा प्रकार से बदल दिया गया int
है String
।ReportGeneration.java
-> प्राप्त करने वाले का उपयोग कर मूल्य निकालता है getEmpId()
,।हम केवल संशोधित कक्षाओं को शामिल करके जार को रिबंड करने वाले हैं। के रूप में ReportGeneration.java
मैं में कोई परिवर्तन नहीं था केवल Employee.class
जार फ़ाइल में शामिल था । मुझे ReportGeneration.class
समस्या को हल करने के लिए फाइल को जार में शामिल करना था ।
मुझे भी यही समस्या हुई है। यह तब भी होता है जब कक्षाओं में अस्पष्टता होती है। मेरा कार्यक्रम एक विधि को लागू करने की कोशिश कर रहा था जो एक ही स्थान / वर्ग पथ में मौजूद दो JAR फ़ाइलों में मौजूद थी। एक JAR फ़ाइल को हटाएँ या अपने कोड को निष्पादित करें जैसे कि केवल एक JAR फ़ाइल का उपयोग किया जाता है। जांचें कि आप एक ही JAR या एक ही JAR के विभिन्न संस्करणों का उपयोग नहीं कर रहे हैं जिनमें समान वर्ग है।
DISP_E_EXCEPTION [चरण] [] [Z-JAVA-105 जावा अपवाद java.lang.NoSuchMethodError (com.example.yourmethod)]
ज्यादातर बार java.lang.NoSuchMethodError को कंपाइलर पकड़ा जाता है लेकिन कभी-कभी यह रनटाइम के दौरान भी हो सकता है। यदि यह त्रुटि रनटाइम पर होती है, तो एकमात्र कारण वर्ग संरचना में बदलाव हो सकता है जिसने इसे असंगत बना दिया।
सर्वोत्तम व्याख्या: https://www.journaldev.com/14538/java-lang-nosuchmethodroor
मुझे यह त्रुटि आई है।
मेरी समस्या यह थी कि मैंने एक विधि के हस्ताक्षर को बदल दिया है, जैसे कुछ
void invest(Currency money){...}
में
void invest(Euro money){...}
इस विधि को इसी तरह के संदर्भ से लागू किया गया था
public static void main(String args[]) {
Bank myBank = new Bank();
Euro capital = new Euro();
myBank.invest(capital);
}
संकलक चेतावनी / त्रुटियों के संबंध में चुप था, क्योंकि पूंजी मुद्रा और यूरो दोनों है।
समस्या इस तथ्य के कारण दिखाई दी कि मैंने केवल उस वर्ग को संकलित किया है जिसमें विधि को परिभाषित किया गया था - बैंक, लेकिन उस वर्ग से नहीं जिस विधि से बुलाया जा रहा है, जिसमें मुख्य () विधि शामिल है।
यह समस्या ऐसी चीज नहीं है जिसका आप अक्सर सामना कर सकते हैं, क्योंकि अक्सर परियोजना को केवल एक संशोधित वर्ग को संकलित करने के बजाय, मैन्युअल रूप से निर्मित किया जाता है या बिल्ड एक्शन स्वचालित रूप से चालू हो जाता है।
मेरा उपयोग यह था कि मैंने एक .jar फ़ाइल बनाई थी जिसका उपयोग एक हॉटफ़िक्स के रूप में किया जाना था, जिसमें App.class शामिल नहीं था क्योंकि यह संशोधित नहीं था। इससे मुझे समझ में नहीं आया कि मैं इसे शामिल न करूं क्योंकि मैंने शुरुआती तर्क के आधार वर्ग गर्त विरासत को रखा था।
बात यह है कि जब आप एक वर्ग को संकलित करते हैं, तो परिणामी बायटेकोड स्थिर है , दूसरे शब्दों में, यह एक कठिन संदर्भ है ।
मूल disassembled bytecode (javap टूल के साथ उत्पन्न) इस तरह दिखता है:
#7 = Methodref #2.#22 // Bank.invest:(LCurrency;)V
ClassLoader द्वारा नए संकलित Bank.class को लोड करने के बाद, उसे ऐसी कोई विधि नहीं मिलेगी, ऐसा प्रतीत होता है जैसे इसे हटा दिया गया था और नहीं बदला गया, इस प्रकार नामित त्रुटि।
उम्मीद है की यह मदद करेगा।
Intelij का उपयोग करते हुए मुझे अपने ग्रैडल प्रोजेक्ट के साथ एक समान समस्या थी। मैंने .gradle (नीचे स्क्रीनशॉट देखें) पैकेज को हटाकर और प्रोजेक्ट के पुनर्निर्माण के द्वारा इसे हल किया। .ग्रेडल पैकेज
NoSuchMethodError: मैंने इस मुद्दे को ठीक करने में कुछ घंटों का समय बिताया है, अंत में इसे सिर्फ पैकेज का नाम बदलने, साफ करने और बनाने के द्वारा निर्धारित किया गया है ... साफ निर्माण पहली कोशिश करें अगर यह वर्ग नाम या पैकेज नाम और स्वच्छ बिल्ड का नाम बदलने की कोशिश नहीं करता है .. .it तय होना चाहिए। सौभाग्य।