2011-05-13 16 views
7

के लिए "प्रतीक नहीं ढूंढ सकता" मेरे पास% CLASSPATH% सेट अप नहीं है। जैसा कि मैं समझता हूं, यह कोई समस्या नहीं होनी चाहिए क्योंकि जावैक वर्तमान निर्देशिका का क्लासपाथ मान लेगा।अपनी खुद की कक्षा

जैसा कि आप नीचे देख सकते हैं, जावैक मेरी Case कक्षा को खोजने में असमर्थ है, भले ही यह एक ही सटीक निर्देशिका में है। यह क्यों हो रहा है पर कोई विचार? जब मैं ग्रहण का उपयोग करता हूं तो यह कोड ठीक काम करता है।

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D>dir /B 
Case.class 
Case.java 
EntryPoint.java 

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D>javac EntryPoint.java 

EntryPoint.java:16: cannot find symbol 
symbol : class Case 
location: class codejam2011.Round0.D.EntryPoint 
       ArrayList<Case> cases = new ArrayList<Case>(); 
         ^
EntryPoint.java:16: cannot find symbol 
symbol : class Case 
location: class codejam2011.Round0.D.EntryPoint 
       ArrayList<Case> cases = new ArrayList<Case>(); 
                ^
EntryPoint.java:24: cannot find symbol 
symbol : class Case 
location: class codejam2011.Round0.D.EntryPoint 
           cases.add(new Case(new Integer(count), line)); 
              ^
3 errors 

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D> 

अद्यतन 1:

(Case.class फ़ाइल को हटाने के बाद भी)

C:\Documents and Settings\joep\My Documents\GCJ\src>javac -cp . codejam2011/Round0/D/EntryPoint.java 

codejam2011\Round0\D\EntryPoint.java:16: cannot access codejam2011.Round0.D.Case 

bad class file: .\codejam2011\Round0\D\Case.java 
file does not contain class codejam2011.Round0.D.Case 
Please remove or make sure it appears in the correct subdirectory of the classpath. 
       ArrayList<Case> cases = new ArrayList<Case>(); 
         ^
1 error 

C:\Documents and Settings\joep\My Documents\GCJ\src> 

अपने पैकेज जड़ (एसआरसी), मैं एक नया त्रुटि मिलती से संकलन करने की कोशिश के बाद अद्यतन 2: ऐसा लगता है कि यह एक अलग पैकेज से Case.java फ़ाइल को पकड़ रहा है।

C:\Documents and Settings\joep\My Documents\GCJ\src>javac -d ../classes codejam2011\Round0\D\*.java 

.\codejam2011\Round0\D\Case.java:4: duplicate class: codejam2011.Round0.C.Case 
public class Case 
    ^
codejam2011\Round0\D\EntryPoint.java:16: cannot access codejam2011.Round0.D.Case 

bad class file: .\codejam2011\Round0\D\Case.java 
file does not contain class codejam2011.Round0.D.Case 
Please remove or make sure it appears in the correct subdirectory of the classpath. 
       ArrayList<Case> cases = new ArrayList<Case>(); 
         ^
2 errors 

C:\Documents and Settings\joep\My Documents\GCJ\src> 
+0

क्या आपने एंट्रीपॉइंट में क्लास केस आयात किया था? – Danish

+0

@Danish: यह आवश्यक नहीं है क्योंकि यह एक ही पैकेज में है। – BalusC

+0

क्या आपने त्रुटि संदेशों का अध्ययन किया था? 'डुप्लिकेट क्लास: codejam2011.Round0.C.Case' सी और डी है - एक अस्पष्टता। आपको कुछ आयातों को बाहर करना होगा, या स्पष्ट रूप से निर्दिष्ट करना होगा कि कौन सा केस, codejam2011.Round0.C.Case या codejam2011.Round0.D.Case का मतलब है। –

उत्तर

18

आपको पैकेज रूट से संकलित करने की आवश्यकता है, न कि पैकेज के अंदर से।

तो, cdsrc फ़ोल्डर में और वहां से संकलित करें।

javac -cp . codejam2011/Round0/D/EntryPoint.java 

अद्यतन: अपनी नई समस्या के अनुसार, आप Case.java उसी तरह पुन: संयोजित करने की जरूरत है। यह स्पष्ट रूप से उसी गलत तरीके से संकलित किया गया था (पैकेज के अंदर से)।

+0

मुझे क्लासपाथ को '.' पर सेट करते समय वही सटीक त्रुटि मिलती है और मैं संकुल का उपयोग कर रहा हूं - शायद यही कारण है कि यह काम नहीं कर रहा है? मेरा पैकेज codejam2011 है। Round0.D –

+0

मैंने जवाब अपडेट किया। मुझे उम्मीद नहीं थी कि आप पैकेज के अंदर से संकलित थे, ऐसा नहीं है कि यह कैसे किया जाए। – BalusC

0

आप संकलन के लिए गलत निर्देशिका में हैं।

location: class codejam2011.Round0.D.EntryPoint 

कि मुझसे कहता है, कि अपने पैकेज codejam2011.Round0.D (जो सम्मेलन (सभी लोअरकेस) के खिलाफ है, लेकिन बिंदु के पास है है ...

codejam2011 की मूल dir, करने के लिए सीडी जो src, है न

javac codejam2011\Round0\D\EntryPoint.java 

चाल हो सकती

अक्सर आप एक निर्देशिका संकलित कक्षाओं के लिए, 'बिन' या 'वर्गों' की तरह है वहाँ वर्गों का उत्पादन करने के लिए, उपयोग?।। - घ (गंतव्य):

javac -d ../classes codejam2011\Round0\D\EntryPoint.java 
+0

लोअरकेस पैकेज सम्मेलन के बारे में टिप के लिए धन्यवाद। मैं इसे ठीक कर दूंगा। संकलन के लिए, अभी भी कोई भाग्य –

+0

नई त्रुटि क्या है? केस किस पैकेज से संबंधित है? क्या यह एक ही पैकेज में है (आसान)? किसी पैकेज में (: = अज्ञात, संभव नहीं)। क्या आपके पास केस के लिए एक विशेष आयात है - मुझे ऐसा नहीं लगता है। 'Javac -d ../classes codejam2011 \ Round0 \ D \ *। जावा' आज़माएं। –

+0

केस और एंट्रीपॉइंट एक ही पैकेज में हैं। (codejam2011.Round0.D) –

1

समस्या अभी तक (अन्य उत्तर देखें) पैकेज रूट निर्देशिका से संकलन द्वारा हल नहीं किया है, तो:

  • सुनिश्चित करें कि सभी स्रोत फ़ाइलों के नाम करने के लिए इसी के साथ वर्गों को शामिल करना उनकी फ़ाइल का नाम
  • सुनिश्चित करें कि सभी स्रोत फ़ाइलों में स्रोत फ़ाइल पदानुक्रम
  • संकलन से पहले अपनी सभी .class फ़ाइलों को हटाएं (यह केवल एक बार आवश्यक हो, यदि आप जांचें बाकी सब कुछ)।

इस प्रकार, यदि फ़ाइल codejam2011\Round0\D\Case.java है, यह package codejam2011.Round0.D; पहले घोषणा के रूप में, और उसके बाद public class Case { ... } शामिल करना चाहिए। साथ ही, सुनिश्चित करें कि इस पैकेज और कक्षा घोषणा वाले कोई अन्य स्रोत फ़ाइल नहीं है।

अपने त्रुटि संदेश से, ऐसा लगता है कि पैकेज बयान package codejam2011.Round0.C; बजाय है (और आप भी असली codejam2011.Round0.C पैकेज में एक वर्ग Case है)।

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