修復 Java 中無法找到或載入主類錯誤
本教程介紹了 Java 中無法找到或載入主類錯誤。
假設我們已經編寫了一段程式碼並編譯了它。到目前為止,一切正常,但是當我們最終執行它時,出現了一個錯誤。
could not find or load main class
本教程將討論為什麼會發生此錯誤以及如何解決它。讓我們首先回顧一下如何使用命令提示符執行 java 程式。
首先,我們使用 javac 命令編譯程式碼,如下所示:
javac < .java file name>
執行上述命令後,將在當前資料夾中建立一個副檔名為 .class
的檔案。
.class
檔案將具有與 .java
程式相同的類。然後我們使用以下命令執行 .class
檔案來執行 Java 程式碼:
java <classname>
我們可能會收到 could not find or load main class
錯誤。此錯誤是執行時錯誤,當 Java 虛擬機器無法找到我們試圖執行的主類(包含 main 方法的類)時發生。
此錯誤最常發生在使用命令提示符執行我們的 Java 程式時。在討論這個錯誤的原因之前,讓我們先了解一下 CLASSPATH。
Java 中的類路徑
這是 executable.class
和其他資原始檔。
JVM 使用它來定位檔案。除非我們在系統變數中明確設定 CLASSPATH,否則預設的 CLASSPATH 是當前目錄。
要執行程式,我們需要傳遞類名。我們以下面的例子來說明這一點:
public class DelftStack{
public static void main(String args[]){
System.out.println("Hello from DelftStack");
}
}
讓我們首先使用 javac 命令編譯它:
C:\Users\User\Documents\DelftStack\java>javac DelftStack.java
C:\Users\USer\Documents\DelftStack\java>
執行上述命令後,在當前目錄中建立了一個 DelftStack.class
檔案。讓我們使用 java 命令執行該檔案。
C:\Users\User\Documents\DelftStack\java>java DelftStack.class
Error: Could not find or load main class DelftStack.class
Caused by: java.lang.ClassNotFoundException: DelftStack.class
在這裡,我們得到一個錯誤,因為我們正在嘗試執行 .class
檔案。相反,我們只需要傳遞類名。
往下看:
C:\Users\User\Documents\DelftStack\java>java DelftStack
Hello from DelftStack
在 Java 中由於傳遞了錯誤的名稱而無法找到錯誤
當我們傳遞錯誤的類名時,也可能出現找不到或載入主類
。繼續前面的示例,如果我們嘗試使用錯誤的名稱執行程式,如下所示:
C:\Users\User\Documents\DelftStack\java>java DelftStac
Error: Could not find or load main class DelftStac
Caused by: java.lang.ClassNotFoundException: DelftStac
我們收到上面的錯誤是因為我們拼錯了類名。在這裡,JVM 試圖執行一個名為 DelftStac
的類,但它並不存在。
我們可以通過正確拼寫類名來解決這個問題,如下所示:
C:\Users\User\Documents\DelftStack\java>java DelftStack
Hello from DelftStack
我們還應該注意,類名是區分大小寫的。如果我們執行類 Delftstack
,我們會得到一個錯誤。
往下看:
C:\Users\User\Documents\DelftStack\java>java Delftstack
Error: Could not find or load main class Delftstack
Caused by: java.lang.NoClassDefFoundError: Delftstack (wrong name: Delftstack)
我們應該使用正確的拼寫和正確的大小寫來成功執行檔案。
由於 Java 中的包名稱錯誤,無法找到錯誤
讓我們將 DelftStack
類移動到 com.DelftStack
包中。包用於將相似的類保持在一起。
看下面的程式碼:
package com.DelftStack;
public class DelftStack{
public static void main(String args[]){
System.out.println("Hello from DelftStack");
}
}
要在 Java 中編譯包,我們使用以下命令:
javac -d . <.java file name>
-d
標誌開關用於告訴將生成的類檔案儲存在哪裡。這 。
表示當前目錄。
我們將上面的程式碼編譯如下:
C:\Users\User\Documents\DelftStack\java>javac -d . DelftStack.java
執行上述命令後,在我們的當前目錄中建立了以下資料夾結構。
com\DelftStack\DelftStack.class
正如我們所看到的,我們的類檔案是我們當前目錄深處的兩個資料夾。因此,如果我們嘗試像以前那樣執行我們的類檔案,我們會得到一個錯誤。
C:\Users\User\Documents\DelftStack\java>java DelftStack
Error: Could not find or load main class DelftStack
Caused by: java.lang.ClassNotFoundException: DelftStack
此錯誤的原因是當前資料夾中不存在 DelftStack
類。要執行包中存在的類,我們需要傳遞其完全限定名稱(在本例中為 com.DelftStack.DelftStack
)。
C:\Users\User\Documents\DelftStack\java>java com.DelftStack.DelftStack
Hello from DelftStack
這告訴 Java 在 com\DelftStack
資料夾中查詢類。
由於 Java 中的 CLASSPATH 錯誤,無法找到錯誤
CLASSPATH 告訴 JVM .class
檔案在哪裡。
假設我們當前在不同的資料夾中,並且我們想要執行一個 Java 程式,其類檔案存在於不同的資料夾中。在這種情況下,我們可以使用 -classpath
選項傳遞類檔案的位置。
例如:
java -classpath XYZ/ABC <class name>
上面的命令告訴 Java 在 ZYX/ABC
資料夾中查詢 .class
檔案。
在前面的例子中,我們建立了一個包。
假設我們要執行 com/DelftStack
資料夾中的檔案。使用以下命令,我們可以這樣做:
>java -classpath ../../ com.DelftStack.DelftStack
Hello from DelftStack
../
表示父目錄。所以 ../../
意味著查詢兩個目錄級別。
讓我們再舉一個例子,假設我們在桌面(資料夾)位置,我們想在計算機的其他地方執行一個類檔案。我們可以通過以下方式做到這一點。
>java -cp C:\Users\User\Documents\DelftStack\java com.DelftStack.DelftStack
Hello from DelftStack
-cp
標誌是 -classpath
的簡寫。在這裡,我們傳遞了存在 .class
檔案的資料夾的完整位置。