在使用命令行進行java程序的編譯和運行時,報“ 找不到或無法加載主類”的錯誤。
首先,在ide中是可以正常編譯和運行的。查找了部分的解決方案,很多人提供的思路是環境變量設置有誤,但檢查
環境變量等均無問題,在參閱了文章:
http://www.cnblogs.com/wangxiaoha/p/6293340.html
之后,發現產生錯誤的原因是對package,類路徑以及java編譯器及虛擬機查找文件的模式不理解,以至命令行輸入混亂。進而查閱書籍,在《Java核心技術卷1》中對Windows系統下使用命令行運行java程序,類路徑以及包之間的關系有較為詳細的闡述,總體來說有一下幾點需要注意。
1.編譯器在編譯源文件的時候不檢查目錄結構。但是如果包和目錄不匹配,虛擬機就找不到類。
所以在出現問題后,發現編譯總能通過,但是運行時會報錯。
2.編譯器對文件進行操作,而java解釋器加載類
eg:javac com/mycompany/PayrollApp.java
java com.mycompany.PayrollApp
Oracle官方也提出了初學者易犯的錯誤就包括使用java xx.class的形式運行程序
A common mistake made by beginner programmers is to try and run the java launcher on the .class file that was created by the compiler. For example, you'll get this error if you try to run your program with java HelloWorldApp.class instead of java HelloWorldApp. Remember, the argument is the name of the class that you want to use, not the filename.
3.javac編譯器總是在當前目錄查找文件,但是Java虛擬機盡在類路徑中有"."目錄的時候才看當前目錄。如果沒有設置類路徑也不會有什么問題,默認的類路徑包含"."目錄,然而設置了類路徑卻忘記包含"."目錄,程序任可通過編譯但是無法運行。
第三條是導致今天發現的錯誤的直接原因
當我們沒有在程序中定義package的時候,直接在文件目錄下進行編譯和運行並不會出現問題


當我們加上package后


我們可以通過編譯但是無法運行,這就是類路徑與目錄不匹配造成。

按照第三條中的描述,添加了"."的包,讓解釋器在demo目錄下搜索文件,問題解決。
