2012-07-17 127 views
3

我有一個奇怪的錯誤。我在同一個軟件包中有兩個類,但他們找不到對方。根據我的記憶,只要這些課程在同一個包中,他們應該能夠調用彼此的方法。java包:找不到符號

我的代碼看起來與此類似:

在A.java:

package com.mypackage; 
public class A{ 
    public static int read(){ 
    //some code 
    } 
} 

在B.java:

package com.mypackage; 
public class B{ 
    public static void main(String args[]){ 
    int x = A.read(); 
    } 
} 

和它給了我一個cannot find symbol variable A錯誤。

這兩個類都依賴於某些.jar文件,但我已經包括那些罐子CLASSPATHA.java編細的路徑,但B因找不到一個出於某些原因...

當我刪除在這兩個類package com.mypackage;然後他們編譯好。

+2

我沒有看到任何類的聲明。你把它們排除在外 – Wug 2012-07-17 17:45:05

+0

如果'A.java'包含一個名爲'C'的包本地類,即使沒有'A'類,它也會被編譯。 – 2012-07-17 17:47:37

+5

你用什麼來編譯這些文件?命令等? – Jyro117 2012-07-17 17:50:45

回答

4

既然你編譯是在不同的包Java文件,你必須確保它們編譯到適當的目錄。

你可以使用這個調用來做到這一點。將$SRC替換爲源文件的位置,並且可以讓$BIN成爲當前目錄或計算機上的其他位置。

javac -sourcepath $SRC -d $BIN A.java B.java 

當你想運行它們,你必須手動重新添加它們到類路徑中(但是這並不是一件壞事)。

java -cp $BIN com.mypackage.B 

該調用應該工作;只是確保與我的桌面上居住的A.java和B.java。使用-d標誌,可確保在編譯時它們轉到相應的包文件夾方案。

+1

它的工作原理!謝謝! 我編譯了你建議的方式。但是當我運行它時,我必須包含jar文件的路徑(跟$ LIB作爲我的罐子的路徑): 'java -cp $ BIN:$ LIB com.mypackage.B' 我是當我編譯時,它並不需要我這麼做... – 2012-07-17 18:15:17

+0

我認爲你編譯*時不需要它們的原因是由於它們已經存在於你的類路徑中。如果它們不是,編譯時就會設置「-cp $ LIB」。 – Makoto 2012-07-17 21:03:17

3

它應該是:

A.java

package com.mypackage; 
class A { 
    public static int read(){ 
     //some code 
    } 
} 

B.java

package com.mypackage; 
class B { 
    public static void main(String args[]){ 
     int x = A.read(); 
    } 
} 
+0

對不起,我很匆忙,忘了在我的文章中包括。我剛剛編輯它。你能再看一次嗎? – 2012-07-17 17:47:39