修復 Java NoClassDefFoundError 錯誤

Rashmi Patidar 2023年10月12日
修復 Java NoClassDefFoundError 錯誤

在 Java 語言中,錯誤是主要由於缺乏資源而發生的異常。此外,錯誤無法在編譯時捕獲並在執行時發生。

這些錯誤也稱為未經檢查的異常。人們無法檢查是否會發生任何錯誤,甚至編譯是否成功完成。

Error 類下存在的各種錯誤是 AssertionErrorNoClassDefFoundErrorOutOfMemoryError 等。

NoClassDefFoundErrorError 類的子型別,它表示或表示 Java 執行時環境或 (JRE) 無法載入類定義,該類定義在編譯時存在,但在執行時不可用。Error 類位於 javas.lang 包內。

NoClassDefFoundError 類位於 LinkageError 下。Error 是一種聯動問題,當我們沒有使用合適的 IDE(整合開發環境)如 IntelliJ IDEA、Eclipse 等,而使用控制檯執行程式時,會出現或遇到的一種聯動問題。

IDE 的工作方式是預先編譯依賴於主類的類。但在控制檯或終端中,由使用者負責編譯所有依賴類,然後執行主類,從而降低連結型別錯誤的風險。

讓我們使用 Java 程式碼塊來理解錯誤

public class NoClassDefinitionError {
  public static void main(String[] args) {
    A a = new A();
    a.show();
  }
}

class A {
  void show() {
    System.out.println("In class A");
  }
}

在上面的程式碼塊中,建立一個名為 NoClassDefinitionError 的 Java 類檔案。使用 .java 副檔名儲存檔案。

然後,在記事本中開啟類,將程式碼塊複製並貼上到類檔案中。開啟命令提示符,然後轉到儲存檔案的位置。

執行第一個命令來編譯程式碼塊 javac NoClassDefinitionError 命令。

該命令要求在使用 javac 命令之前預設設定 PATH 環境變數。確保 PATH 變數已經預先新增了 java 的 bin 位置。

否則它會給出一個錯誤,因為 javac 未被識別為內部或外部命令、可執行的程式或批處理檔案問題。

javac 命令允許編譯器建立一個 .class 檔案,該檔案只是 java 檔案的位元組碼版本。這個檔案很容易被 Java 虛擬機器或 JVM 理解來執行程式。

現在,到達儲存 .java 檔案的位置。找到執行 javac 命令後建立的 .class 檔案似乎很容易。從該位置手動刪除 A.class 檔案。

嘗試執行命令 java NoClassDefinitionError

java 命令通過載入所有依賴類檔案並搜尋 main 方法在內部執行 Java 應用程式。當找不到類定義時,它會顯示執行時異常。

下面是一個錯誤塊的小程式碼,當這個 Error 出現時,它會被填充。

Exception in thread "main" java.lang.NoClassDefFoundError
    : A at NoClassDefinitionError.(NoClassDefinitionError.java : 3)

下面列出了在我們遇到任何錯誤時根除問題的各種解決方案。

  • 檢查要執行的類名是否在確切和所需的位置。
  • 檢查是否存在 .class 檔案用於嘗試執行的 java 類。如果類檔案不存在,則首先編譯另一個類並獲取要生成的類檔案。
  • 檢查傳遞依賴項並編譯執行主類檔案所需的類。A->B 和 B->C 在這種情況下,A 是傳遞依賴於 C 類的。傳遞依賴表示在功能上相互依賴的三個不同檔案之間存在一種間接關係。
  • 直接使用 IDE 環境減少了避免 noClassDefFoundError 問題的機會,因為依賴解析和傳遞依賴將在實際執行之前處理。
  • 正確檢查堆疊跟蹤,因為它可以正確理解問題開始出現的位置及其在程式碼流中的影響,從所有地方丟擲。堆疊跟蹤應該有助於解決問題。
  • 將 Java 命令執行的位置新增到 CLASSPATH 變數中。當程式在 Java 執行時環境中執行時,該變數有助於定位要選擇和載入類檔案的路徑。
作者: Rashmi Patidar
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

相關文章 - Java Error