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中。


以上全属推论。

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