"प्रतीक नहीं मिल सकता है" या "प्रतीक का समाधान नहीं कर सकता" त्रुटि का मतलब है?
कृपया "प्रतीक नहीं ढूंढ सकते", "प्रतीक का समाधान नहीं कर सकते" या "प्रतीक नहीं मिला" त्रुटियों के बारे में निम्नलिखित व्याख्या करें:
- उनका क्या मतलब है?
- क्या चीजें उन्हें पैदा कर सकती हैं?
- उन्हें ठीक करने के बारे में प्रोग्रामर कैसे जाता है?
इस प्रश्न को जावा में इन सामान्य संकलन त्रुटियों के बारे में एक व्यापक प्रश्नोत्तर के लिए तैयार किया गया है।
जवाब
0. क्या दोनों त्रुटियों में कोई अंतर है?
ज़रुरी नहीं। "प्रतीक नहीं मिल सकता है", "प्रतीक को हल नहीं कर सकता" और "प्रतीक नहीं मिला" सभी का एक ही मतलब है। विभिन्न जावा कंपाइलर विभिन्न वाक्यांशशास्त्र का उपयोग करते हैं।
1. "प्रतीक नहीं मिल सकता" त्रुटि का क्या मतलब है?
सबसे पहले, यह एक संकलन त्रुटि 1 है । इसका मतलब है कि या तो आपके जावा स्रोत कोड में कोई समस्या है , या जिस तरीके से आप इसे संकलित कर रहे हैं , उसमें कोई समस्या है।
आपके जावा स्रोत कोड में निम्नलिखित चीजें हैं:
- कीवर्ड: की तरह
true
,false
,class
,while
, और इतने पर। - शाब्दिक: की तरह
42
और'X'
और"Hi mum!"
। - ऑपरेटरों और अन्य गैर-शब्दसंख्यात्क टोकन: की तरह
+
,=
,{
, और इतने पर। - पहचानकर्ता: की तरह
Reader
,i
,toString
,processEquibalancedElephants
, और इतने पर। - टिप्पणियाँ और व्हॉट्सएप।
पहचानकर्ताओं के बारे में "प्रतीक नहीं मिल सकता है" त्रुटि। जब आपका कोड संकलित किया जाता है, तो कंपाइलर को यह जानने की आवश्यकता होती है कि आपके कोड में प्रत्येक पहचानकर्ता का क्या अर्थ है।
"प्रतीक नहीं मिल सकता है" त्रुटि का अर्थ है कि संकलक ऐसा नहीं कर सकता है। आपका कोड किसी ऐसी चीज़ का जिक्र करता प्रतीत होता है जिसे कंपाइलर नहीं समझता है।
2. "प्रतीक नहीं मिल सकता" त्रुटि का कारण क्या हो सकता है?
पहले आदेश के रूप में, केवल एक कारण है। संकलक उन सभी स्थानों पर देखा गया जहाँ पहचानकर्ता को परिभाषित किया जाना चाहिए, और यह परिभाषा नहीं पा सका। यह कई चीजों के कारण हो सकता है। आम इस प्रकार हैं:
सामान्य तौर पर पहचानकर्ताओं के लिए:
- शायद आपने नाम गलत लिखा; के
StringBiulder
बजाय यानीStringBuilder
। जावा खराब वर्तनी या टाइपिंग त्रुटियों की भरपाई करने का प्रयास नहीं कर सकता है। - शायद आपको मामला गलत लगा; के
stringBuilder
बजाय यानीStringBuilder
। सभी जावा पहचानकर्ता केस संवेदी हैं। - शायद आपने अनुचित रूप से अंडरस्कोर का इस्तेमाल किया; यानी
mystring
औरmy_string
अलग हैं। (यदि आप जावा शैली के नियमों से चिपके रहते हैं, तो आप इस गलती से काफी हद तक सुरक्षित रहेंगे ...) - शायद आप किसी ऐसी चीज़ का उपयोग करने की कोशिश कर रहे हैं जिसे "कहीं और" घोषित किया गया था; एक अलग संदर्भ में, जहाँ आपने संकलक को देखने के लिए कहा है। (एक अलग वर्ग? एक अलग गुंजाइश? एक अलग पैकेज? एक अलग कोड-आधार?)
- शायद आपने नाम गलत लिखा; के
चर के लिए संदर्भित करने वाले पहचानकर्ताओं के लिए:
- शायद आप चर घोषित करना भूल गए।
- शायद चर घोषणा उस दायरे से बाहर है जिस बिंदु पर आपने इसका उपयोग करने की कोशिश की थी। (नीचे उदाहरण देखें)
पहचानकर्ताओं के लिए जो विधि या क्षेत्र के नाम होने चाहिए:
शायद आप एक विरासत पद्धति या क्षेत्र को संदर्भित करने का प्रयास कर रहे हैं जो माता-पिता / पूर्वजों की कक्षाओं या इंटरफेस में घोषित नहीं किया गया था।
शायद आप उस विधि या क्षेत्र को संदर्भित करने का प्रयास कर रहे हैं जो आपके द्वारा उपयोग किए जा रहे प्रकार में मौजूद नहीं है (अर्थात घोषित नहीं किया गया है); जैसे
"someString".push()
२ ।शायद आप एक क्षेत्र के रूप में एक विधि का उपयोग करने की कोशिश कर रहे हैं, या इसके विपरीत; जैसे
"someString".length
याsomeArray.length()
।शायद आप गलती से सरणी तत्व के बजाय एक सरणी पर काम कर रहे हैं; जैसे
String strings[] = ... if (strings.charAt(3)) { ... } // maybe that should be 'strings[0].charAt(3)'
ऐसे पहचानकर्ताओं के लिए जिन्हें कक्षा के नाम होने चाहिए:
शायद आप वर्ग आयात करना भूल गए।
शायद आपने "स्टार" आयात का उपयोग किया था, लेकिन वर्ग आपके द्वारा आयात किए गए किसी भी पैकेज में परिभाषित नहीं है।
शायद आप एक के
new
रूप में भूल गए :String s = String(); // should be 'new String()'
उन मामलों के लिए जहां प्रकार या उदाहरण में वह सदस्य नहीं दिखाई देता है जिसकी आप अपेक्षा कर रहे थे:
- शायद आपने एक नेस्टेड क्लास या जेनेरिक पैरामीटर घोषित किया है जो उस प्रकार को छाया देता है जिसका आप उपयोग करने के लिए अर्थ थे।
- शायद आप एक स्थिर या उदाहरण चर को छाया कर रहे हैं।
- शायद आपने गलत प्रकार का आयात किया; जैसे IDE पूरा होने या ऑटो करेक्शन के कारण।
- शायद आप एक एपीआई के गलत संस्करण का उपयोग (के खिलाफ संकलन) कर रहे हैं।
- शायद आप अपनी वस्तु को एक उपयुक्त उपवर्ग में डालना भूल गए।
समस्या अक्सर उपरोक्त का एक संयोजन है। उदाहरण के लिए, शायद आपने "स्टार" आयात किया java.io.*
और फिर Files
वर्ग का उपयोग करने की कोशिश की ... जो कि java.nio
नहीं है java.io
। या हो सकता है आप लिखते हैं करने के लिए होती File
है ... जो है में एक वर्ग java.io
।
यहाँ एक उदाहरण दिया गया है कि कैसे गलत परिवर्तनीय स्कोपिंग "प्रतीक नहीं ढूंढ सकता" त्रुटि का कारण बन सकता है:
List<String> strings = ...
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).equalsIgnoreCase("fnord")) {
break;
}
}
if (i < strings.size()) {
...
}
यह कथन i
में "प्रतीक नहीं ढूंढ सकता" त्रुटि देगा if
। हालांकि हमने पहले घोषित किया था i
, कि घोषणा केवल बयान और उसके शरीर के लिए गुंजाइशfor
है। बयान i
में संदर्भ उस घोषणा को नहीं देख सकता है । यह दायरे से बाहर है ।if
i
(यहां एक उपयुक्त सुधार if
लूप के अंदर स्टेटमेंट को स्थानांतरित करने या लूप i
की शुरुआत से पहले घोषित करने के लिए हो सकता है।)
यहां एक उदाहरण है जो पहेली का कारण बनता है जहां एक टाइपो एक प्रतीत होता है कि अक्षम्य "प्रतीक नहीं मिल सकता है" त्रुटि:
for (int i = 0; i < 100; i++); {
System.out.println("i is " + i);
}
यह आपको println
कॉल में एक संकलन त्रुटि देगा, जो i
यह नहीं कह सकता है। लेकिन (मैं आपको सुनता हूं) मैंने इसे घोषित किया था!
समस्या स्नीकी अर्धविराम ( ;
) से पहले है {
। जावा भाषा सिंटैक्स एक खाली कथन होने के संदर्भ में एक अर्धविराम को परिभाषित करता है । खाली स्टेटमेंट तब for
लूप की बॉडी बन जाती है । तो यह कोड वास्तव में इसका मतलब है:
for (int i = 0; i < 100; i++);
// The previous and following are separate statements!!
{
System.out.println("i is " + i);
}
{ ... }
ब्लॉक के शरीर नहीं है for
पाश, और इसलिए की पिछली घोषणा i
में for
बयान है क्षेत्र से बाहर ब्लॉक में।
यहाँ "एक प्रतीक मिल सकता है" त्रुटि का एक और उदाहरण है जो टाइपो के कारण होता है।
int tmp = ...
int res = tmp(a + b);
पिछले घोषणा के बावजूद, tmp
में tmp(...)
अभिव्यक्ति गलत है। कंपाइलर नामक एक विधि की tmp
तलाश करेगा, और एक नहीं मिलेगा। पहले घोषित किया गया tmp
है वैरिएबल के नामस्थान में, न कि विधियों के लिए नामस्थान।
उदाहरण में मैं भर आया था, प्रोग्रामर वास्तव में एक ऑपरेटर छोड़ दिया था। वह लिखने का मतलब यह था:
int res = tmp * (a + b);
यदि आप कमांड लाइन से संकलन कर रहे हैं तो कंपाइलर को प्रतीक नहीं मिल सकता है, इसका एक और कारण है। आप बस कुछ अन्य वर्ग को संकलित या फिर से जोड़ना भूल गए होंगे। उदाहरण के लिए, यदि आपके पास कक्षाएं हैं Foo
और Bar
जहां Foo
उपयोग होता है Bar
। यदि आपने कभी संकलित नहीं किया है Bar
और आप चलते हैं javac Foo.java
, तो आप यह पता लगाने के लिए उत्तरदायी हैं कि संकलक प्रतीक नहीं ढूँढ सकता है Bar
। सरल उत्तर संकलन Foo
और Bar
एक साथ करना है; जैसे javac Foo.java Bar.java
या javac *.java
। या बेहतर अभी भी जावा बिल्ड टूल का उपयोग करें; जैसे चींटी, मावेन, गादले इत्यादि।
कुछ और अस्पष्ट कारण भी हैं ... जिनका मैं नीचे से सामना करूंगा।
3. मैं इन त्रुटियों को कैसे ठीक करूं?
आम तौर पर बोलते हुए, आप यह पता लगाते हैं कि संकलन त्रुटि का कारण क्या है ।
- संकलन त्रुटि संदेश द्वारा इंगित फ़ाइल में पंक्ति को देखें।
- पहचानें कि कौन सा प्रतीक त्रुटि संदेश के बारे में बात कर रहा है।
- यह पता लगाने क्यों संकलक कह रहा है कि यह प्रतीक नहीं मिल सकता है; ऊपर देखो!
फिर आप सोचते हैं कि आपका कोड क्या कहने वाला है। फिर अंत में आप वर्कआउट करते हैं कि आपको अपने सोर्स कोड में क्या सुधार करना है।
ध्यान दें कि हर "सुधार" सही नहीं है। इस पर विचार करो:
for (int i = 1; i < 10; i++) {
for (j = 1; j < 10; j++) {
...
}
}
मान लीजिए कि संकलक कहता है "के लिए प्रतीक नहीं मिल सकता है" j
। ऐसे कई तरीके हैं जिनसे मैं "ठीक" कर सकता हूं:
- मैं भीतर
for
को बदल सकता थाfor (int j = 1; j < 10; j++)
- शायद सही। - मैं आंतरिक लूप, या बाहरी लूप
j
से पहले के लिए एक घोषणा जोड़ सकता हूं - संभवतः सही।for
for
- मैं बदल सकता है
j
के लिएi
भीतरी मेंfor
पाश - शायद गलत! - और इसी तरह।
मुद्दा यह है कि आपको यह समझने की आवश्यकता है कि आपका कोड सही फ़िक्स को खोजने के लिए क्या करने की कोशिश कर रहा है।
4. अस्पष्ट कारण
यहां कुछ ऐसे मामले हैं जहां "प्रतीक नहीं मिल सकता है" प्रतीत होता है कि जब तक आप करीब नहीं दिखते, तब तक यह अक्षम्य है।
गलत निर्भरताएँ : यदि आप एक IDE या बिल्ड टूल का उपयोग कर रहे हैं जो बिल्ड पथ और प्रोजेक्ट निर्भरता का प्रबंधन करता है, तो आपने निर्भरताओं के साथ एक गलती की हो सकती है; जैसे एक निर्भरता को छोड़ दिया, या गलत संस्करण का चयन किया। यदि आप बिल्ड टूल (चींटी, मेवेन, ग्रैडल आदि) का उपयोग कर रहे हैं, तो प्रोजेक्ट की बिल्ड फ़ाइल की जाँच करें। यदि आप एक आईडीई का उपयोग कर रहे हैं, तो प्रोजेक्ट के बिल्ड पथ कॉन्फ़िगरेशन की जांच करें।
आप recompiling नहीं कर रहे हैं : यह कभी-कभी होता है कि नए जावा प्रोग्रामर समझ नहीं पाते हैं कि जावा टूल चेन कैसे काम करता है, या एक दोहराने योग्य "बिल्ड प्रक्रिया" को लागू नहीं किया है; जैसे IDE, Ant, Maven, Gradle इत्यादि का उपयोग करना। ऐसी स्थिति में, प्रोग्रामर अपनी पूंछ का पीछा करते हुए एक भ्रामक त्रुटि की तलाश कर सकता है जो वास्तव में कोड को ठीक से नहीं रेकॉर्ड करने के कारण होता है, और जैसे ...
पहले की बिल्ड समस्या : यह संभव है कि पहले वाला निर्माण इस तरह से विफल रहा हो जिसने लापता कक्षाओं के साथ एक जार फाइल दी हो। यदि आप बिल्ड टूल का उपयोग कर रहे थे तो ऐसी विफलता आमतौर पर देखी जाएगी। हालाँकि अगर आपको किसी और से JAR फाइलें मिल रही हैं, तो आप उन पर ठीक से निर्माण कर रहे हैं , और त्रुटियों को देख रहे हैं। यदि आपको इस पर संदेह है,
tar -tvf
तो संदिग्ध JAR फ़ाइल की सामग्री को सूचीबद्ध करने के लिए उपयोग करें।आईडीई मुद्दे : लोगों ने ऐसे मामलों की सूचना दी है जहां उनका आईडीई भ्रमित हो जाता है और आईडीई में कंपाइलर एक ऐसी कक्षा नहीं पा सकता है जो मौजूद है ... या रिवर्स स्थिति।
ऐसा हो सकता है यदि IDE को गलत JDK संस्करण के साथ कॉन्फ़िगर किया गया हो।
ऐसा हो सकता है अगर आईडीई के कैश फ़ाइल सिस्टम के साथ सिंक से बाहर निकलते हैं। इसे ठीक करने के लिए आईडीई विशिष्ट तरीके हैं।
यह एक IDE बग हो सकता है। उदाहरण के लिए @ जोएल कॉस्टिग्लियोला एक ऐसे परिदृश्य का वर्णन करता है जहां एक्लिप्स एक मावेन "परीक्षण" पेड़ को सही ढंग से नहीं संभालता है: इस उत्तर को देखें ।
Android समस्याएं : जब आप Android के लिए प्रोग्रामिंग कर रहे हैं, और आपके पास "प्रतीक नहीं पा सकते हैं" से संबंधित त्रुटियां हैं
R
, तो ध्यान रखें किR
प्रतीकcontext.xml
फ़ाइल द्वारा परिभाषित किए गए हैं। जांचें कि आपकीcontext.xml
फ़ाइल सही है और सही जगह पर है, और यह कि संबंधितR
वर्ग फ़ाइल जनरेट / संकलित हो गई है। ध्यान दें कि जावा प्रतीक संवेदनशील हैं, इसलिए संबंधित XML आईडी भी संवेदनशील हैं।एंड्रॉइड पर अन्य प्रतीक त्रुटियां पहले उल्लिखित कारणों के कारण होने की संभावना है; मिसिंग या गलत निर्भरताएँ, गलत पैकेज नाम, विधि या फ़ील्ड जो किसी विशेष API संस्करण में मौजूद नहीं हैं, वर्तनी / टाइपिंग त्रुटियां, और इसी तरह।
सिस्टम कक्षाओं को फिर से परिभाषित करना : मैंने ऐसे मामले देखे हैं जहां कंपाइलर शिकायत करता
substring
है कि निम्नलिखित की तरह कुछ में एक अज्ञात प्रतीक हैString s = ... String s1 = s.substring(1);
यह पता चला कि प्रोग्रामर ने अपना स्वयं का संस्करण बनाया था
String
और कक्षा के उनके संस्करण नेsubstring
तरीकों को परिभाषित नहीं किया था ।पाठ: अपनी खुद की कक्षाओं को समान पुस्तकालय कक्षाओं के समान नामों से परिभाषित न करें!
Homoglyphs: यदि आप अपनी स्रोत फ़ाइलों के लिए UTF-8 एन्कोडिंग का उपयोग करते हैं, तो ऐसे पहचानकर्ता होना संभव है जो समान दिखते हों , लेकिन वास्तव में भिन्न होते हैं क्योंकि उनमें समरूपताएँ होती हैं। देखें इस पेज में अधिक जानकारी के लिए।
आप स्रोत फ़ाइल एन्कोडिंग के रूप में ASCII या लैटिन -1 में खुद को सीमित करके, और
\uxxxx
अन्य पात्रों के लिए जावा एस्केप का उपयोग करके इससे बच सकते हैं।
1 - यदि, गड़बड़ी, आप इसे एक रनटाइम अपवाद या त्रुटि संदेश में देखते हैं, तो या तो आपने संकलन त्रुटियों के साथ कोड चलाने के लिए अपना आईडीई कॉन्फ़िगर किया है, या आपका एप्लिकेशन रनटाइम पर कोड बना रहा है और संकलन कर रहा है।
2 - सिविल इंजीनियरिंग के तीन बुनियादी सिद्धांत: पानी ऊपर की ओर नहीं बहता है, एक तख्ती इसके किनारे पर मजबूत होती है, और आप एक तार पर धक्का नहीं दे सकते ।
यदि आप भूल जाते हैं तो आपको यह त्रुटि भी मिलेगी new
:
String s = String();
बनाम
String s = new String();
क्योंकि new
कीवर्ड के बिना कॉल कोशिश करेगा और एक (स्थानीय) विधि की तलाश करेगा, जिसे String
तर्क के बिना कहा जाता है - और वह विधि हस्ताक्षर संभवतः परिभाषित नहीं है।
'परिवर्तनीय दायरे से बाहर है' का एक और उदाहरण
मैंने देखा है के रूप में है कि सवाल की तरह कुछ समय पहले से ही, क्या गैरकानूनी है करने के लिए हो सकता है एक और उदाहरण भले ही यह हो सकता है महसूस हो रहा है ठीक है।
इस कोड पर विचार करें:
if(somethingIsTrue()) {
String message = "Everything is fine";
} else {
String message = "We have an error";
}
System.out.println(message);
यह अमान्य कोड है। क्योंकि नामांकित कोई message
भी चर उनके संबंधित दायरे के बाहर दिखाई नहीं देता है - जो {}
इस मामले में आसपास के कोष्ठक होंगे ।
आप कह सकते हैं: "लेकिन संदेश नामक एक चर को या तो परिभाषित किया गया है - इसलिए संदेश कोif
" के बाद परिभाषित किया गया है ।
लेकिन आप गलत होंगे।
जावा के पास कोई free()
भी delete
ऑपरेटर नहीं है, इसलिए यह पता लगाने के लिए कि कब चर का उपयोग नहीं किया जाता है (कारण के इन चर के संदर्भ के साथ) का पता लगाने के लिए चर गुंजाइश पर निर्भर रहना पड़ता है।
यह विशेष रूप से बुरा है अगर आपको लगा कि आपने कुछ अच्छा किया है। मैंने इस तरह के "अनुकूलन" कोड के बाद इस तरह की त्रुटि देखी है:
if(somethingIsTrue()) {
String message = "Everything is fine";
System.out.println(message);
} else {
String message = "We have an error";
System.out.println(message);
}
"ओह, डुप्लिकेट कोड है, चलो उस आम लाइन को बाहर खींचते हैं" -> और वहाँ यह।
इस तरह की गुंजाइश-परेशानी से निपटने का सबसे आम तरीका होगा कि बाहर के दायरे में चर नामों के लिए अन्य मूल्यों को पूर्व-असाइन किया जाए और फिर यदि में फिर से असाइन करें:
String message = "We have an error";
if(somethingIsTrue()) {
message = "Everything is fine";
}
System.out.println(message);
ग्रहण में इस त्रुटि को प्राप्त करने का एक तरीका:
- में एक वर्ग
A
को परिभाषित करेंsrc/test/java
। - कक्षा
B
काsrc/main/java
उपयोग करने वाले किसी अन्य वर्ग को परिभाषित करेंA
।
परिणाम: ग्रहण कोड संकलित करेगा, लेकिन मावेन "प्रतीक नहीं ढूंढ सकता" देगा।
अंतर्निहित कारण: ग्रहण मुख्य और परीक्षण पेड़ों के लिए एक संयुक्त निर्माण पथ का उपयोग कर रहा है। दुर्भाग्य से, यह एक ग्रहण परियोजना के विभिन्न हिस्सों के लिए विभिन्न बिल्ड पथों का उपयोग करने का समर्थन नहीं करता है, जो कि मावेन की आवश्यकता होती है।
समाधान :
- इस तरह से अपनी निर्भरता को परिभाषित न करें; यानी यह गलती मत करो।
- नियमित रूप से मावेन का उपयोग करके अपने कोडबेस का निर्माण करें ताकि आप इस गलती को जल्दी से उठा सकें। ऐसा करने का एक तरीका CI सर्वर का उपयोग करना है।
"नहीं मिल सकता है" का अर्थ है कि, संकलक जो उपयुक्त चर, विधि, वर्ग आदि नहीं ढूँढ सकता है ... यदि आपको वह त्रुटि मालिश मिल गई है, तो सबसे पहले आप कोड लाइन ढूंढना चाहते हैं जहां त्रुटि मालिश प्राप्त करें..और फिर आप करेंगे यह पता लगाने में सक्षम है कि किस चर, विधि या वर्ग का उपयोग करने से पहले परिभाषित नहीं किया गया है। पुष्टि के बाद कि चर, विधि या वर्ग का उपयोग बाद की आवश्यकता के लिए किया जा सकता है ... निम्नलिखित उदाहरण पर विचार करें।
मैं एक डेमो क्लास बनाऊँगा और एक नाम प्रिंट करूँगा ...
class demo{
public static void main(String a[]){
System.out.print(name);
}
}
अब देखिए नतीजा ..
उस त्रुटि में कहा गया है, "चर नाम नहीं मिल सकता है" .. 'नाम' चर के लिए मान को परिभाषित करना और आरंभ करना उस त्रुटि को समाप्त कर सकता है..इस तरह से,
class demo{
public static void main(String a[]){
String name="smith";
System.out.print(name);
}
}
अब नए आउटपुट को देखें ...
ठीक है सफलतापूर्वक उस त्रुटि को हल किया..एक ही समय में, यदि आप "विधि नहीं ढूँढ सकते हैं" या "कक्षा नहीं पा सकते हैं" कुछ, पहले तो, एक वर्ग या विधि को परिभाषित करें और उसके बाद उपयोग करें ।।
यदि आपको बिल्ड में यह त्रुटि कहीं और मिल रही है, जबकि आपका IDE कहता है कि सब कुछ पूरी तरह से ठीक है, तो जांचें कि आप दोनों जगहों पर एक ही जावा संस्करण का उपयोग कर रहे हैं।
उदाहरण के लिए, जावा 7 और जावा 8 में अलग-अलग एपीआई हैं, इसलिए पुराने जावा संस्करण में गैर-मौजूद एपीआई को कॉल करना इस त्रुटि का कारण होगा।
हल किया
IntelliJ का उपयोग करना
बिल्ड चुनें -> पुनर्निर्माण परियोजना इसे हल करेगी
मुझे भी यह त्रुटि हो रही थी। (जिसके लिए मैंने गुगली की और मुझे इस पृष्ठ पर निर्देशित किया गया)
समस्या: मैं एक प्रोजेक्ट के वर्ग में परिभाषित एक स्थैतिक विधि को दूसरे प्रोजेक्ट में परिभाषित वर्ग बी से परिभाषित कर रहा था। मुझे निम्नलिखित त्रुटि मिल रही थी:
error: cannot find symbol
समाधान: मैंने इसे पहले प्रोजेक्ट का निर्माण करके हल किया, जहां विधि को परिभाषित किया गया है फिर उस परियोजना को जहां से विधि को बुलाया जा रहा था।
यदि ग्रहण जावा बिल्ड पथ 7, 8 और प्रोजेक्ट pom.xml Maven गुण java.version में मैप किया गया है, तो 7,8 की तुलना में उच्च जावा संस्करण (9,10,11, आदि) का उल्लेख किया गया है, आपको pom में अपडेट करने की आवश्यकता है। xml फ़ाइल।
ग्रहण में यदि जावा को जावा संस्करण 11 में मैप किया जाता है और pom.xml में इसे जावा संस्करण में मैप किया जाता है। 8. ग्रहण आईडीई सहायता में नीचे दिए गए चरणों के माध्यम से जावा 11 तक ग्रहण समर्थन को अपडेट करें -> नया सॉफ्टवेयर स्थापित करें ->
लिंक का पालन पेस्ट http://download.eclipse.org/eclipse/updates/4.9-P-builds में साथ काम करने के लिए
या
जोड़ें (पॉपअप विंडो खुल जाएगी) ->
Name:
Java 11 सपोर्ट
Location:
http://download.eclipse.org/eclipse/updates/4.9-P-builds
फिर नीचे के रूप में pom.xml फ़ाइल के मावेन गुणों में जावा संस्करण को अपडेट करें
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
अंत में प्रोजेक्ट डीबग पर राइट क्लिक करें -> मावेन क्लीन, मावेन स्टेप्स
विभिन्न परिदृश्य हो सकते हैं जैसा कि लोगों ने ऊपर उल्लेख किया है। कुछ चीजों ने मुझे इसे हल करने में मदद की है।
यदि आप IntelliJ का उपयोग कर रहे हैं
File -> 'Invalidate Caches/Restart'
या
संदर्भित किया जा रहा वर्ग किसी अन्य प्रोजेक्ट में था और यह निर्भरता मेरे प्रोजेक्ट की ग्रेडल बिल्ड फ़ाइल में नहीं जोड़ी गई थी। इसलिए मैंने निर्भरता का उपयोग करके जोड़ा
compile project(':anotherProject')
और यह काम किया। HTH!
आपने मावेन संकलन का उपयोग करके अपना कोड संकलित किया और फिर इसे ठीक काम करने के लिए मावेन परीक्षण का उपयोग किया। अब यदि आपने अपने कोड में कुछ परिवर्तन किया है और फिर संकलन किए बिना आप इसे चला रहे हैं, तो आपको यह त्रुटि मिलेगी।
समाधान: फिर से इसे संकलित करें और फिर परीक्षण चलाएं। मेरे लिए इस तरह से काम किया।
मेरे मामले में - मुझे नीचे ऑपरेशन करना पड़ा:
- हटो
context.xml
से फाइलsrc/java/package
करने के लिएresource
निर्देशिका (इंटेलीजे आईडीई) - स्वच्छ
target
निर्देशिका।
संकेत के लिए, क्लास नाम के नाम को देखें जो एक त्रुटि और लाइन नंबर फेंकता है, उदाहरण: संकलन विफलता [ERROR] \ Applications \ xxxxx.java: [44,30] त्रुटि: प्रतीक नहीं ढूँढ सकता
Java version jdk7 बनाम के लिए एक अन्य कारण असमर्थित विधि है। 8. अपना% JAVA_HOME% जांचें
हमें एक जावा प्रोजेक्ट में त्रुटि मिली, जिसे ग्रैडल मल्टी-प्रोजेक्ट बिल्ड के रूप में सेट किया गया है। यह पता चला कि उप-परियोजनाओं में से एक ग्रेडल जावा लाइब्रेरी प्लगइन गायब था । इसने उप-परियोजना की वर्ग फ़ाइलों को बिल्ड में अन्य परियोजनाओं के लिए दृश्यमान होने से रोक दिया।
build.gradle
निम्नलिखित तरीके से उप-प्रोजेक्ट में जावा लाइब्रेरी प्लगइन जोड़ने के बाद , त्रुटि दूर हो गई:
plugins {
...
id 'java-library'
}
मैंने इस त्रुटि को इस तरह हल किया ... Android का पागलपन। मेरे पास एडॉप्टर के रूप में पैकेज का नाम था और मैंने एडॉप्टर को "ए" के बजाय "ए" के साथ नाम दिया और त्रुटि को हल किया।