java命令报错-找不到或无法加载主类

来源:互联网 发布:转行数据分析师 编辑:程序博客网 时间:2024/05/19 20:18

在学习java和算法过程中,有时需要使用java的编译和执行命令。但是有时总是会出现这种场景:javac命令编译成功了,但使用java命令执行二进制class文件时,报找不到或者无法加载主类的错误,如下图。谷歌百度了一把,发现网上说的那些都是扯淡的,没有一个说到点子上了。经过思考实践看书,总算知道原因了。



首先,我们先看下javac和java命令的区别,具体可以参考《java核心技术卷二》的4.7.3章节(将类放入包中)和4.8章节(类路径)。

1. javac命令,编译源文件.java,产生二进制.class文件。这个命令是有javac编译器实现的,执行时会去查找类。我们都会在环境变量中设置classpath,这个类路径就是javac命令查找文件的顺序。例如classpath设置为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;, 那么javac命令时,首先查找当前目录,如果没有类文件,则查找第二个路径,以此类推知道找到,否则报编译错误。javac命令查找类路径是以文件分隔符”\”查找的。

2. java命令,执行二进制class文件。该命令是java解释器命令,执行java命令也是同样会去查找类路径。就拿这个例子来说,执行java Test命令的查找类的步骤为,首先查找当前目录下的包路径,查看是否有该类,如果没有查找%JAVA_HOME%\lib\包路径下有无该类,其次查找%JAVA_HOME%\lib\tools.jar\包路径下有无该类。java命令加载类路径(包路径)是通过“.”或者“\”来作为分隔符的,

通过上面两个命令的区别,很容易看出来,上面截图中执行的java Test,会去该路径下执行Test.class:D:\workspace\practice_JEE\test4\src\com\clq\collection\javacore\com\clq\collection\javacore\javacore\,显然该路径是不存在的,所以会报错。

同理,下面几个路径下执行命令的结果就很容易理解了。

1.不同路径下的javac命令执行结果


2. 不同路径下的java命令执行结果



由此问题可以引申,查阅java编译器、解释器相关内容,后续再学习。


阅读全文
0 0
原创粉丝点击