"प्रतीक नहीं ढूँढ सकता है" या "प्रतीक का समाधान नहीं कर सकता" त्रुटि का मतलब है?


395

कृपया "प्रतीक नहीं ढूँढ सकते" और "प्रतीक को हल नहीं कर सकते" त्रुटियों के बारे में निम्नलिखित व्याख्या करें:

  • उनका क्या मतलब है?
  • क्या चीजें उन्हें पैदा कर सकती हैं?
  • उन्हें ठीक करने के बारे में प्रोग्रामर कैसे जाता है?

यह प्रश्न जावा में इन सामान्य संकलन त्रुटियों के बारे में एक व्यापक प्रश्नोत्तर तैयार करने के लिए बनाया गया है।

जवाबों:


417

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में संदर्भ उस घोषणा को नहीं देख सकता है । यह दायरे से बाहर हैifi

(यहां एक उपयुक्त सुधार 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 से पहले के लिए एक घोषणा जोड़ सकता हूं - संभवतः सही।forfor
  • मैं बदल सकता है jके लिए iभीतरी में forपाश - शायद गलत!
  • और इसी तरह।

मुद्दा यह है कि आपको यह समझने की आवश्यकता है कि आपका कोड सही फ़िक्स को खोजने के लिए क्या करने की कोशिश कर रहा है।

4. अस्पष्ट कारण

यहां कुछ ऐसे मामले हैं जहां "प्रतीक नहीं मिल सकता है" प्रतीत होता है कि जब तक आप करीब नहीं दिखते हैं, तब तक यह अक्षम्य है।

  1. गलत निर्भरताएँ : यदि आप एक IDE या बिल्ड टूल का उपयोग कर रहे हैं जो बिल्ड पथ और प्रोजेक्ट निर्भरता का प्रबंधन करता है, तो आपने निर्भरताओं के साथ एक गलती की हो सकती है; जैसे एक निर्भरता छोड़ दिया, या गलत संस्करण का चयन किया। यदि आप बिल्ड टूल (चींटी, मेवेन, ग्रैडल आदि) का उपयोग कर रहे हैं, तो प्रोजेक्ट की बिल्ड फ़ाइल की जाँच करें। यदि आप एक आईडीई का उपयोग कर रहे हैं, तो प्रोजेक्ट के बिल्ड पथ कॉन्फ़िगरेशन की जांच करें।

  2. आप recompiling नहीं कर रहे हैं : यह कभी-कभी होता है कि नए जावा प्रोग्रामर समझ नहीं पाते हैं कि जावा टूल चेन कैसे काम करता है, या एक दोहराने योग्य "बिल्ड प्रक्रिया" को लागू नहीं किया है; जैसे IDE, Ant, Maven, Gradle इत्यादि का उपयोग करना। ऐसी स्थिति में, प्रोग्रामर अपनी पूंछ का पीछा करते हुए एक भ्रामक त्रुटि की तलाश कर सकता है, जो वास्तव में कोड को ठीक से नहीं हटाने के कारण होता है, और जैसे ...

  3. पहले की बिल्ड समस्या : यह संभव है कि पहले का निर्माण इस तरह से विफल रहा हो जिसने लापता कक्षाओं के साथ एक जार फाइल दी हो। यदि आप बिल्ड टूल का उपयोग कर रहे थे तो ऐसी विफलता आमतौर पर देखी जाएगी। हालाँकि, अगर आपको किसी और से JAR फाइलें मिल रही हैं, तो आप उन पर ठीक से निर्माण कर रहे हैं , और त्रुटियों को नोटिस कर रहे हैं। यदि आपको इस पर संदेह है, tar -tvfतो संदिग्ध JAR फ़ाइल की सामग्री को सूचीबद्ध करने के लिए उपयोग करें।

  4. आईडीई मुद्दे : लोगों ने ऐसे मामलों की सूचना दी है जहां उनका आईडीई भ्रमित हो जाता है और आईडीई में कंपाइलर एक ऐसी कक्षा नहीं पा सकता है जो मौजूद है ... या रिवर्स स्थिति।

    • ऐसा हो सकता है यदि IDE को गलत JDK संस्करण के साथ कॉन्फ़िगर किया गया हो।

    • ऐसा हो सकता है अगर आईडीई के कैश फ़ाइल सिस्टम के साथ सिंक से बाहर निकलते हैं। इसे ठीक करने के लिए आईडीई विशिष्ट तरीके हैं।

    • यह एक IDE बग हो सकता है। उदाहरण के लिए @ जोएल कोस्टिग्लियोला एक ऐसे परिदृश्य का वर्णन करता है जहां एक्लिप्स एक मावेन "परीक्षण" पेड़ को सही ढंग से नहीं संभालता है: इस उत्तर को देखें

  5. Android समस्याएँ : जब आप एंड्रॉइड के लिए प्रोग्रामिंग कर रहे हों, और आपके पास "प्रतीक नहीं पा सकते" से संबंधित त्रुटियां हों R, तो ध्यान रखें कि Rप्रतीक context.xmlफ़ाइल द्वारा परिभाषित किए गए हैं। जांचें कि आपकी context.xmlफ़ाइल सही है और सही जगह पर है, और यह कि संबंधित Rवर्ग फ़ाइल जनरेट / संकलित हो गई है। ध्यान दें कि जावा प्रतीक संवेदनशील हैं, इसलिए संबंधित XML आईडी भी संवेदनशील हैं।

    एंड्रॉइड पर अन्य प्रतीक त्रुटियां पहले उल्लिखित कारणों के कारण होने की संभावना है; उदाहरण के लिए गुम या गलत निर्भरताएँ, गलत पैकेज नाम, विधि या फ़ील्ड जो किसी विशेष API संस्करण में मौजूद नहीं हैं, वर्तनी / टाइपिंग त्रुटियां, और इसी तरह।

  6. सिस्टम कक्षाओं को फिर से परिभाषित करना : मैंने ऐसे मामले देखे हैं जहां कंपाइलर शिकायत करता substringहै कि निम्नलिखित की तरह कुछ में एक अज्ञात प्रतीक है

    String s = ...
    String s1 = s.substring(1);
    

    यह पता चला कि प्रोग्रामर ने अपना स्वयं का संस्करण बनाया था Stringऔर कक्षा के उनके संस्करण ने substringतरीकों को परिभाषित नहीं किया था ।

    पाठ: अपनी खुद की कक्षाओं को समान पुस्तकालय कक्षाओं के समान नामों से परिभाषित न करें!

  7. Homoglyphs: यदि आप अपनी स्रोत फ़ाइलों के लिए UTF-8 एन्कोडिंग का उपयोग करते हैं, तो ऐसे पहचानकर्ता होना संभव है जो समान दिखते हों , लेकिन वास्तव में भिन्न होते हैं क्योंकि उनमें समरूपताएँ होती हैं। देखें इस पेज में अधिक जानकारी के लिए।

    आप स्रोत फ़ाइल एन्कोडिंग के रूप में ASCII या लैटिन -1 में खुद को सीमित करके, और \uxxxxअन्य पात्रों के लिए जावा एस्केप का उपयोग करके इससे बच सकते हैं।


1 - यदि, गड़बड़ी, आप इसे एक रनटाइम अपवाद या त्रुटि संदेश में देखते हैं, तो या तो आपने संकलन त्रुटियों के साथ कोड को चलाने के लिए अपना आईडीई कॉन्फ़िगर किया है, या आपका एप्लिकेशन रनटाइम पर कोड बना रहा है और संकलन कर रहा है।

2 - सिविल इंजीनियरिंग के तीन बुनियादी सिद्धांत: पानी ऊपर की ओर नहीं बहता है, एक तख्ती इसके किनारे पर मजबूत होती है, और आप एक तार पर धक्का नहीं दे सकते


मेरे पास एक और स्थिति थी, जहां इस संकलन में त्रुटि हुई, जबकि ग्रहण समस्या को नहीं देख रहा था: क्रमशः अन्य वर्ग में निर्भरता वाली दो कक्षाएं। मेरे मामले में मेरे पास एक एनम था, एक इंटरफ़ेस को लागू करना, एक वर्ग में परिभाषित किया गया था जहां मैं मूर्खतापूर्वक पहले से ही एनम का उपयोग करता था।
जोगी

ऊपर की टिप्पणी के समान ही, जब मैं ग्रहण से अपना कार्यक्रम संकलित करता हूं और चलाता हूं तो यह कोई समस्या नहीं है। कंसोल से इसे संकलित करने से इन "गुच्छा पा सकते हैं प्रतीक" त्रुटियों का एक गुच्छा अक्सर एक आयात में अंतिम तत्व से संबंधित है। मुझे नहीं पता कि यह क्या कारण है क्योंकि कोड में कुछ भी गलत नहीं है।
एंड्रेस स्टैडलमैन

एक अन्य समस्या यह है कि आईडीई इस श्रेणी की अन्य त्रुटियों की "व्याख्या" कर सकता है। उदाहरण के लिए यदि मानक संकलक के तहत कक्षा स्तर पर रखा printlnगया है System.out.printlnतो हमें <identifier> expected( डेमो ) मिलेगा लेकिन इंटेलीजे में हम देखेंगे Cannot resolve symbol 'println'( डेमो )।
साहीमो

वाह। मुझे लगता है कि एक संकलक बग कहते हैं।
स्टीफन सी

23

यदि आप भूल जाते हैं तो आपको यह त्रुटि भी मिलेगी new:

String s = String();

बनाम

String s = new String();

क्योंकि newकीवर्ड के बिना कॉल की कोशिश होगी और एक (स्थानीय) विधि की तलाश की जाएगी, जिसे Stringतर्क के बिना कहा जाता है - और वह विधि हस्ताक्षर संभवतः परिभाषित नहीं है।


14

'परिवर्तनीय दायरे से बाहर है' का एक और उदाहरण

मैंने देखा है के रूप में है कि सवाल की तरह कुछ समय पहले से ही, क्या गैरकानूनी है करने के लिए हो सकता है एक और उदाहरण भले ही यह हो सकता है महसूस हो रहा है ठीक है।

इस कोड पर विचार करें:

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);

4
"जावा का कोई स्वतंत्र () या हटाने वाला ऑपरेटर नहीं है, इसलिए इसे यह पता लगाने के लिए कि क्या अब चर का उपयोग नहीं किया जाता है (कारण के इन चर के संदर्भों के साथ) पर नज़र रखने के लिए चर गुंजाइश पर निर्भर रहना पड़ता है।" - जबकि सच है, यह प्रासंगिक नहीं है। C और C ++ के पास क्रमशः ऑपरेटर / फ्री हैं, और फिर भी आपके उदाहरणों के बराबर C / C ++ कोड अवैध होगा। C और C ++ ब्लॉक जावा की तरह ही चर के दायरे को सीमित करते हैं। वास्तव में, यह अधिकांश "ब्लॉक संरचित" भाषाओं के लिए सच है।
स्टीफन सी

1
कोड के लिए बेहतर समाधान जो प्रत्येक शाखा पर एक अलग मूल्य प्रदान करता है, एक रिक्तfinal चर घोषणा का उपयोग करना है ।
डैनियल प्रेडेन

10

ग्रहण में इस त्रुटि को प्राप्त करने का एक तरीका:

  1. में एक वर्ग Aको परिभाषित करें src/test/java
  2. कक्षा Bका src/main/javaउपयोग करने वाले किसी अन्य वर्ग को परिभाषित करें A

परिणाम: ग्रहण कोड संकलित करेगा, लेकिन मावेन "प्रतीक नहीं ढूंढ सकता" देगा।

अंतर्निहित कारण: ग्रहण मुख्य और परीक्षण पेड़ों के लिए एक संयुक्त निर्माण पथ का उपयोग कर रहा है। दुर्भाग्य से, यह एक ग्रहण परियोजना के विभिन्न हिस्सों के लिए विभिन्न बिल्ड पथों का उपयोग करने का समर्थन नहीं करता है, जो कि मावेन की आवश्यकता होती है।

समाधान :

  1. इस तरह से अपनी निर्भरता को परिभाषित न करें; यानी यह गलती मत करो।
  2. मावेन का उपयोग करके अपने कोडबेस को नियमित रूप से बनाएं ताकि आप इस गलती को जल्दी उठा सकें। ऐसा करने का एक तरीका CI सर्वर का उपयोग करना है।

इसका क्या हल है?

2
जो कुछ भी आप src / main / java में उपयोग करते हैं, उसे src / main / java में या किसी compile / runtime निर्भरता (टेस्ट निर्भरता नहीं) में परिभाषित करने की आवश्यकता होती है।
जोएल कोस्टीगोला

5

"नहीं मिल सकता है" का अर्थ है कि, संकलक जो उपयुक्त चर, विधि, वर्ग आदि नहीं ढूँढ सकते हैं ... यदि आपको वह त्रुटि मालिश मिल गई है, तो सबसे पहले आप कोड लाइन ढूंढना चाहते हैं जहां त्रुटि मालिश प्राप्त करें..और फिर आप करेंगे यह पता लगाने में सक्षम है कि कौन सा चर, विधि या वर्ग इसे उपयोग करने से पहले परिभाषित नहीं करता है। पुष्टि के बाद कि चर, विधि या वर्ग का उपयोग बाद की आवश्यकता के लिए किया जा सकता है ... निम्नलिखित उदाहरण पर विचार करें।

मैं एक डेमो क्लास बनाऊँगा और एक नाम प्रिंट करूँगा ...

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);
      }
}

अब नए आउटपुट को देखें ...

यहां छवि विवरण दर्ज करें

ठीक है उस त्रुटि को सफलतापूर्वक हल किया..एक ही समय में, यदि आप "विधि नहीं ढूँढ सकते हैं" या "कक्षा नहीं पा सकते हैं" कुछ, सबसे पहले, एक वर्ग या विधि को परिभाषित करें और उसके बाद उपयोग करें ।।


3

यदि आपको बिल्ड में यह त्रुटि कहीं और मिल रही है, जबकि आपका आईडीई कहता है कि सब कुछ पूरी तरह से ठीक है, तो जांचें कि आप दोनों स्थानों में एक ही जावा संस्करण का उपयोग कर रहे हैं।

उदाहरण के लिए, जावा 7 और जावा 8 में अलग-अलग एपीआई हैं, इसलिए पुराने जावा संस्करण में गैर-मौजूद एपीआई को कॉल करना इस त्रुटि का कारण होगा।


2

मुझे भी यह त्रुटि हो रही थी। (जिसके लिए मैंने गुगली की और मुझे इस पृष्ठ पर निर्देशित किया गया)

समस्या: मैं किसी प्रोजेक्ट A के वर्ग में परिभाषित एक स्थिर विधि को दूसरे प्रोजेक्ट B में परिभाषित वर्ग से कह रहा था। मुझे निम्न त्रुटि मिल रही थी:

error: cannot find symbol

समाधान: मैंने इसे पहले उस परियोजना के निर्माण से हल किया, जहां विधि को परिभाषित किया गया है फिर उस परियोजना को जहां से विधि को बुलाया जा रहा था।


हां, यह तब हो सकता है जब आप अपने वर्तमान पैकेज से कुछ सामान्य फ़ंक्शन को अपने सामान्य बर्तन पैकेज में स्थानांतरित करने का निर्णय लेते हैं, उदाहरण के लिए, लेकिन फिर आप अपने वर्तमान पैकेज से फ़ंक्शन को कॉल करने से पहले अपने सामान्य पैकेज को संकलित करना भूल जाते हैं।
बिल्डिंगकॉफी

2

यदि ग्रहण जावा बिल्ड पथ 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>

अंत में प्रोजेक्ट डीबग पर राइट क्लिक करें -> मावेन क्लीन, मावेन स्टेप्स


2

हल किया

बिल्ड चुनें -> पुनर्निर्माण परियोजना इसे हल करेगी


1
यह बहुत कुछ निर्भर करता है और आमतौर पर ऐसा नहीं होता है।
मार्टन बोडेवेस

1

विभिन्न परिदृश्य हो सकते हैं जैसा कि लोगों ने ऊपर उल्लेख किया है। कुछ चीजों ने मुझे इसे हल करने में मदद की है।

  1. यदि आप IntelliJ का उपयोग कर रहे हैं

    File -> 'Invalidate Caches/Restart'

या

  1. संदर्भित किया जा रहा वर्ग किसी अन्य प्रोजेक्ट में था और यह निर्भरता मेरे प्रोजेक्ट की ग्रेडल बिल्ड फ़ाइल में नहीं जोड़ी गई थी। इसलिए मैंने उपयोग करने पर निर्भरता को जोड़ा

    compile project(':anotherProject')

और यह काम किया। HTH!


1

आपने मावेन संकलन का उपयोग करके अपना कोड संकलित किया और फिर इसे ठीक काम करने के लिए मावेन परीक्षण का उपयोग किया। अब यदि आपने अपने कोड में कुछ परिवर्तन किया है और फिर संकलन किए बिना आप इसे चला रहे हैं, तो आपको यह त्रुटि मिलेगी।

समाधान: फिर से इसे संकलित करें और फिर परीक्षण चलाएं। मेरे लिए इस तरह से काम किया।


1

मेरे मामले में - मुझे नीचे ऑपरेशन करना था:

  1. हटो context.xmlसे फाइल src/java/packageकरने के लिए resourceनिर्देशिका (इंटेलीजे आईडीई)
  2. स्वच्छ targetनिर्देशिका।

संदर्भों की परवाह किए बिना फ़ाइल ले जाना इस त्रुटि का कारण हो सकता है। मैं पहले ही इससे मिल चुका हूं। बस गेट पर रीसेट करें और ध्यान से फिर से ले जाएं, त्रुटि हल।
हुइ ह्म ह्नह

0

संकेत के लिए, वर्ग नाम के नाम को देखें जो एक त्रुटि और लाइन नंबर फेंकता है, उदाहरण: संकलन विफलता [ERROR] \ Applications \ xxxxx.java: [44,30] त्रुटि: प्रतीक नहीं ढूँढ सकता

Java version jdk7 बनाम के लिए एक अन्य कारण असमर्थित विधि है। 8. अपना% JAVA_HOME% जांचें


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