3 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
其實(shí)解決方案很簡(jiǎn)單,既然編譯器不能根據(jù)包名找到A類(lèi),那我們就把A類(lèi)的絕對(duì)路徑直接告訴編譯器不就可以了嗎?事實(shí)上就是這么做的,具體操作為:在命令行模式下進(jìn)入F:\test目錄,然后運(yùn)行編譯命令javac F:\test\edu\main\A.java,可以成功編譯生成A.class文件。(注意:如果不在此目錄下執(zhí)行編譯命令的話(huà),就要將f:\test加入到當(dāng)前的classpath中為make工具提供B.java的位置信息)
接下來(lái)就要運(yùn)行這個(gè)class文件了,運(yùn)行仍然在F:\test目錄下執(zhí)行(注意:如果不在此目錄下執(zhí)行運(yùn)行命令的話(huà),一定要把F:\test加入到當(dāng)前的classpath中),命令為:java edu.main.A,很顯然,這里就是根據(jù)輸入的package名稱(chēng)找到對(duì)應(yīng)的class文件,并檢驗(yàn)找到的class文件的與輸入的包名是否匹配(例如:如果你在edu目錄下新建一個(gè)test目錄,將A.class文件拷貝進(jìn)去,輸入java edu.test.A 的話(huà)還是會(huì)報(bào)錯(cuò):找不到class文件)。可能有人要問(wèn):為什么運(yùn)行的時(shí)候又可以根據(jù)包名找到相應(yīng)的class文件呢?因?yàn)檫\(yùn)行的時(shí)候默認(rèn)是從當(dāng)前路徑開(kāi)始搜索的,如果當(dāng)前路徑找不到的話(huà),就在系統(tǒng)的classpath中找,如果再找不到就會(huì)報(bào)錯(cuò)。
由上面的分析我們可以得出:
(1)在命令行模式下編譯java文件時(shí),如果cmd不在該java文件所在的目錄下,就要直接指定文件
的絕對(duì)路徑(javac F:\test\edu\main\A.java),如果在java文件所在的目錄下,可以不指定
路徑,但是要設(shè)置classpath讓編譯器的make工具找到其他import的類(lèi)
(2)運(yùn)行的時(shí)候要指出包路徑(java edu.main.A),并且一定要在class文件名前帶上完整的包名
(edu.main.A),而且該包所在的文件夾(即edu所在的文件夾)一定要在classpath中,這樣才
能找到對(duì)應(yīng)的class文件(在包所在的文件夾目錄下運(yùn)行cmd程序或者將該目錄加入到classpath
中均可)。
(3)在命令行模式下非直接編譯的java,編譯器使用make工具根據(jù)java文件中的import信息間接找
到引用的java文件,所以一定要注意文件的配置,以及相互之間的位置關(guān)系。當(dāng)然也可以通過(guò)
設(shè)置classpath提供給make工具,但是如果文件比較多而且相互之間的引用關(guān)系比較復(fù)雜的話(huà)會(huì)
比較麻煩。
(4)classpath只能供make工具以及運(yùn)行class文件時(shí)使用,在直接編譯的時(shí)候不使用classpath信
息,必須在要編譯的java文件前帶上其絕對(duì)的路徑名。

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
一、先建立一個(gè)包,把兩個(gè)類(lèi)放到放進(jìn)里面,然后調(diào)用編譯。
二、如果兩個(gè)類(lèi)不在同一個(gè)包內(nèi),需要導(dǎo)入包名,用import 導(dǎo)入,
important 后面跟包的名稱(chēng),試試看。

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
NoClassDefFoundError異常 說(shuō)明你A類(lèi)里面不知道B類(lèi) 我看是你的B類(lèi)沒(méi)有public吧 一個(gè)類(lèi)要能夠被另外一個(gè)類(lèi)import必須的public 而不是default,你把B類(lèi)的寫(xiě)成如下在試試:
package ***;
public class B{
}
A類(lèi)使用:
package **;// a的包名
import ***.B; //導(dǎo)入B
public class A{//your fun}
添加回答
舉報(bào)