2011-05-13 146 views
7

我沒有設置%CLASSPATH%。據我所知,這不應該是一個問題,因爲Javac會承擔當前目錄的類路徑。「我找不到符號」我的班級

正如你在下面看到的,即使它在同一個確切的目錄下,javac也無法找到我的Case類。任何想法爲什麼發生這種情況?當我使用Eclipse時,此代碼正常工作。

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> 

從我的包根(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

您是否在EntryPoint中導入class Case? – Danish 2011-05-13 21:43:33

+0

@Danish:這是沒有必要的,因爲它在同一個包中。 – BalusC 2011-05-13 21:47:28

+0

你學習了錯誤信息嗎? '重複類:codejam2011.Round0.C.Case'有C和D - 含糊不清。你必須排除一些導入,或者明確地指定哪個Case,codejam2011.Round0.C.Case或codejam2011.Round0.D.Case的意思。 – 2011-05-13 22:25:03

回答

18

您需要從軟件包根目錄進行編譯,而不是從軟件包內部進行編譯。

因此,cdsrc文件夾並從那裏編譯。

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

更新:按你的新的問題,您需要重新編譯Case.java相同的方式。顯然,編譯方式是相同的(從包內部)。

+0

當我將類路徑設置爲'.'並且使用包時,我會得到同樣的確切錯誤 - 也許這就是爲什麼它不起作用?我的包是codejam2011.Round0.D – 2011-05-13 21:44:25

+0

我更新了答案。我沒想到你是從包裏面編譯的,這不是要做的。 – BalusC 2011-05-13 21:46:12

0

你在錯誤的目錄中進行編譯。

location: class codejam2011.Round0.D.EntryPoint 

這告訴我,你的包是codejam2011.Round0.D(這是對公約(全部小寫),但跑題了...

光盤codejam2011的父目錄,這爲src,是不是

javac codejam2011\Round0\D\EntryPoint.java 

可能做的伎倆

通常你有一個目錄編譯的類,如「斌」或「類」到那裏產生的類,使用? - d (目的地):

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

感謝關於小寫包約定的提示。我會解決這個問題。至於編譯,還是沒有運氣 – 2011-05-13 21:57:11

+0

什麼是新錯誤? Case屬於哪個包?它是否在同一個包中(容易)?沒有包(:=匿名,不可能)。你有沒有特別的案例 - 我不這麼認爲。試試'javac -d ../classes codejam2011 \ Round0 \ D \ *。java'。 – 2011-05-13 22:01:11

+0

Case和EntryPoint處於相同的包中。 (codejam2011.Round0.D) – 2011-05-13 22:04:38

1

如果問題還沒有從包根目錄編制(見其他答案)解決:

  • 確保所有的源文件包含有對應的名稱類他們的文件名
  • 請確保所有源文件都包含與源文件層次結構中的位置相對應的包語句
  • 在編譯之前刪除所有的.class文件(這應該只需要一次,如果您檢查編輯一切)。

因此,如果該文件是codejam2011\Round0\D\Case.java,它應該包含package codejam2011.Round0.D;作爲第一聲明,然後public class Case { ... }。另外,請確保沒有包含此包和類聲明的其他源文件。

從您的錯誤消息,它看起來像包裝語句是package codejam2011.Round0.C;而不是(你也有一個類Case在真正的codejam2011.Round0.C包)。

相關問題