1. 程式人生 > >java命令報錯-找不到或無法載入主類

java命令報錯-找不到或無法載入主類

在學習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編譯器、直譯器相關內容,後續再學習。