Java 找不到或無法加載主類的修復方法
有時,當我們運行Java程序時,我們可能會看到“找不到或無法加載主類”。原因很容易猜測:JVM找不到主類並給出瞭這個錯誤。但是為什麼不能呢?
在本文中,我們將討論找不到主類的可能原因。另外,我們將看看如何修復它們。
示例程序
我們將從HelloWorld程序開始:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }
現在讓我們編譯它:
$ javac HelloWorld.java
在這裡,編譯器將為我們的程序生成一個.class文件。此.class文件將在同一目錄中生成。class文件將與Java程序中給定的類名具有相同的名稱。這個.class文件是可執行的。
在下面的部分中,我們將運行這個.class文件,並嘗試理解錯誤“找不到或加載主類”的可能原因。
錯誤的類名
要運行Java編譯器生成的.class文件,可以使用以下命令:
java <.class filename>
運行我們的程序:
$ java helloworld Error: Could not find or load main class helloworld
是的,它失敗瞭,錯誤是“Could not find or load main class helloworld”
即找不到或加載主類helloworld。
如前所述,編譯器將生成.class文件,其名稱與程序中Java類的名稱完全相同。所以在我們的例子中,主類的名稱是HelloWorld,而不是helloworld,要區分大小寫。
讓我們用正確的方式再試一次:
$ java HelloWorld Hello world..!!!
這次它成功地運行瞭。
文件擴展名
要編譯Java程序,必須提供文件名及其擴展名(.java):
$ javac HelloWorld.java
但是要運行.class文件,我們需要提供類名,而不是文件名。因此不需要提供.class擴展:
$ java HelloWorld.class Error: Could not find or load main class HelloWorld.class
同樣,讓我們使用正確的類名運行程序:
$ java HelloWorld Hello world..!!!
Java包名稱
在Java中,我們將類似的類放在一起,稱之為包。
讓我們把HelloWorld類移到com.baeldung
包:
package com.baeldung; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }
現在,讓我們像以前一樣編譯並運行更新的HelloWorld程序:
$ java HelloWorld Error: Could not find or load main class HelloWorld
但我們再次得到錯誤“找不到或加載主類HelloWorld”!
讓我們試著理解我們錯過瞭什麼。
要運行包中的Java類,必須提供其完全限定名。所以在我們的例子中,HelloWorld的完全限定名是:com.baeldung.HelloWorld
.
現在,當我們創建com.baeldung
包時實際上我們創建瞭一個文件夾結構,如:
com/baeldung/HelloWorld.java
首先,讓我們嘗試從com/baeldung
目錄運行程序:
$ java com.baeldung.HelloWorld Error: Could not find or load main class com.baeldung.HelloWorld
盡管如此,我們還是無法運行我們的程序。
在這裡,當我們指定完全限定類名時:com.baeldung.HelloWorld
,Java試圖找到HelloWorld.class
類文件在com/baeldung
中,在我們運行程序的目錄下。
由於我們已經在com/baeldung中,Java無法找到並運行HelloWorld程序。
現在,讓我們回到父文件夾並運行它:
$ java com.baeldung.HelloWorld Hello world..!!!
是的,我們再次能夠向世界問好。
類路徑無效
在繼續之前,讓我們首先瞭解什麼是類路徑classpath——它是當前運行的JVM可用的一組類。
我們使用classpath變量告訴JVM在文件系統上的何處找到.class文件。
在運行程序時,我們可以使用-classpath選項提供類路徑。例子:
java -classpath /my_programs/compiled_classes HelloWorld
在這裡,Java將尋找HelloWorld.class
類文件在/my_programs/compiled_classes
文件夾中,這個文件夾的名稱是我們剛剛編出來的。默認情況下,classpath變量設置為“.”,表示當前目錄。
在上面的部分中,我們更改瞭目錄以運行程序。但是如果我們想從其他文件夾運行它呢?這時classpath變量可以幫助我們。
要從com/baeldung目錄運行我們的程序,我們可以簡單地說,我們的類路徑是向上的兩個目錄—每個包部分一個:
$ java -claspath ../../ com.baeldung.HelloWorld Hello world..!!!
這裡,“…”表示父目錄。在本例中,“../../”表示包層次結構的頂部。
以上就是Java 找不到或無法加載主類的修復方法的詳細內容,更多關於Java 找不到或無法加載主類的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Java 中 Class Path 和 Package的使用詳解
- java編譯命令基礎知識點
- java項目中classpath指向哪裡
- 如何用Dos命令運行Java版HelloWorld你知道嗎
- 關於Java錯誤提示之找不到或無法加載主類的問題及正確處理方法