Java找不到主類引發的探究

一、

同一目錄下,兩個文件

t.java

console.bat


t.java:

package t;
public class t{
	public static void main(String[] args){
		System.out.println("Hello world!");
	}
}

console.bat:

@ECHO OFF
SET JAVAHOME=D:\Java\JDK-8u91-1.8.0_91
SET PATH=%PATH%;%JAVAHOME%\bin;%JAVAHOME%\lib\dt.jar;%JAVAHOME%\bin\tools.jar;.;
cmd

(console在此處配置路徑)

打開console.bat,在其中編譯並運行t.java,結果如下:

wKioL1dtdCDitREEAAAUHcD1LUU504.png


如果java靠環境變量找到java類文件,那麼java t按理應該是可以運行的(因爲當前目錄已被包含在環境變量中,參見console.bat)


二、

如果把t.java中的package t;註釋掉就可以運行。這就跟我們平常直接新建一個java文件,碼碼完直接命令行運行是一樣的。這就可以用classpath來解釋t.class是怎麼被找到的。如果把當前路徑去掉,又會提示找不到主類。所以,可以推斷,主類是通過PATH中的路徑找到的。可是這又怎麼解釋第一種情況呢?


三、

wKioL1dtd1jiVbgCAAA8IONlhdQ287.png

如圖,t1文件夾中也有一個t1.java文件,它跟t0.java的區別在於它有package t1;, 而t0.java並沒有package語句。

兩者運行情況如下:

wKiom1dteFDyybT0AAA4bZlUsWc712.png

對於t0.java,一個是t0.class==classpath/t0/t0;一個是classpath+=t0,t0.class==classpath/t0。t1.java相似。依據上面的情況,也就是說,如果java命令後的類文件沒有包含父目錄,那麼該源文件本身就沒有package語句,反之。所以,java不僅靠PATH路徑來找的類文件,而它還通過這兩種殊途同歸的方式來檢查package,以至於不會發生這種“java文件自身聲明所在包與實際所在包不符”的情況。


結論:java x/x/x/aClass能運行意味着aClass在package x.x.x中。


以上全屬推論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章