簡體   English   中英

“錯誤:在 MyClass 類中找不到主方法,請將主方法定義為...”

[英]"Error: Main method not found in class MyClass, please define the main method as..."

新的 Java 程序員在嘗試運行 Java 程序時經常會遇到如下消息。 (不同的 Java 工具、IDE 等針對此問題提供了多種診斷方法。)


Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Error: Main method not found in the file, please define the main method as: 
   public static void main(String[] args)

Error: Main method is not static in class MyClass, please define the main method as:
   public static void main(String[] args)

Error: Main method must return a value of type void in class MyClass, please
define the main method as:
   public static void main(String[] args)

java.lang.NoSuchMethodError: main
Exception in thread "main"

這是什么意思,什么會導致它,應該怎么做才能解決它?

當您使用java命令從命令行運行 Java 應用程序時,例如,

java some.AppName arg1 arg2 ...

該命令加載您指定的類,然后查找名為main的入口點方法。 更具體地說,它正在尋找一個聲明如下的方法:

package some;
public class AppName {
    ...
    public static void main(final String[] args) {
        // body of main method follows
        ...
    }
}

入口點方法的具體要求是:

  1. 該方法必須在指定的類中。
  2. 方法的名稱必須是“main”,並且完全大寫1
  3. 該方法必須是public
  4. 該方法必須是static2
  5. 方法的返回類型必須是void
  6. 該方法必須只有一個參數,並且參數的類型必須是String[] 3

可以使用varargs語法聲明該參數;例如String... args 。有關更多信息,請參閱此問題String[]參數用於從命令行傳遞參數,即使您的應用程序不使用命令也是必需的-line 參數。)

如果不滿足上述任何一個要求, java命令將失敗並顯示一些消息變體:

Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

或者,如果您運行的是非常舊的 Java 版本:

java.lang.NoSuchMethodError: main
Exception in thread "main"

如果您遇到此錯誤,請檢查您是否有一個main方法,並且它是否滿足上面列出的所有六個要求。


1 - 一個真正晦澀的變體是“main”中的一個或多個字符不是 LATIN-1 字符……而是一個 Unicode 字符,在顯示時看起來像相應的 LATIN-1 字符。
2 -這里解釋了為什么該方法需要是靜態的。
3 - String必須是標准的java.lang.String類,而不是隱藏標准類的名為String的自定義類。

問題是您嘗試調用的類中沒有public void main(String[] args)方法。

  • 必須是static
  • 必須只有一個字符串數組參數(可以命名為任何名稱)
  • 必須以小寫形式拼寫 main。

請注意,您實際上已經指定了一個現有的類(否則錯誤會有所不同),但該類缺少 main 方法。

其他答案在總結main的要求方面做得很好。 我想收集有關記錄這些要求的參考資料。

最權威的來源是VM規范(引用的第二版)。 由於main不是語言特性,Java 語言規范中沒有考慮它。

另一個很好的資源是應用程序啟動器本身的文檔:

如果您正在運行正確的類並且 main 定義正確,還要檢查您是否在同一個包中定義了一個名為 String 的類。 將考慮 String 類的這個定義,因為它沒有與main(java.lang.String[] args)確認,你會得到同樣的異常。

  • 這不是編譯時錯誤,因為編譯器只是假設您正在定義自定義 main 方法。

建議永遠不要在包中隱藏庫 java 類。

異常的名稱表明程序試圖調用一個不存在的方法。 在這種情況下,聽起來程序沒有main方法,但如果您發布導致錯誤的代碼和運行代碼的上下文會有所幫助。

如果用戶嘗試運行沒有main方法的.class文件或.jar文件,則可能會發生這種情況 - 在 Java 中, main方法是開始執行程序的入口點。

通常編譯器應該防止這種情況發生,所以如果發生這種情況,通常是因為被調用的方法的名稱是在運行時確定的,而不是編譯時。

要解決這個問題,新程序員必須要么添加中間方法(假設仍然缺少它的main方法) ,要么將方法調用更改為確實存在的方法的名稱。

在此處閱讀有關主要方法的更多信息:http: //csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

通常,這意味着您嘗試運行的程序沒有“main”方法。 如果你要執行一個 Java 程序,被執行的類必須有一個main方法:

例如,在文件 Foo.java

public class Foo {
    public static void main(final String args[]) {
        System.out.println("hello");
    }
}

這個程序應該可以編譯和運行沒有問題——如果main被調用了別的東西,或者不是靜態的,它會產生你遇到的錯誤。

每個可執行程序,不管是什么語言,都需要一個入口點,告訴解釋器、操作系統或機器從哪里開始執行。 在 Java 的情況下,這是靜態方法main ,它被傳遞給包含命令行參數的參數args[] 該方法等價於 C 語言中的int main(int argc, char** argv)

我覺得上面的答案錯過了即使您的代碼具有 main() 也會發生此錯誤的情況。 當您使用使用反射調用方法的 JNI 時。 在運行時如果沒有找到方法,你會得到一個

java.lang.NoSuchMethodError: No virtual method

如果您使用的是 VSCode:

在此處輸入圖像描述

選擇:清潔工作區

在此處輸入圖像描述

選擇:重啟並刪除

繼續編碼:-)

對於那些在Kotlin 項目中遇到這個問題的人。

您可以嘗試刪除 .idea 文件夾並再次運行該項目 - 對我來說它解決了這個問題。 (最好先關閉 IntelliJ)

似乎有時 IntelliJ 對主要方法簽名感到困惑,並期待 java 簽名而不是 Kotlin 簽名。

幾分鍾后,我面臨“未定義主要方法”。現在它已解決。我嘗試了以上所有方法,但沒有任何效果。我的 java 文件中沒有編譯錯誤。 我跟着下面的事情

  • 只是在所有依賴項目中進行了 maven 更新(alt+F5)。

現在問題解決了。得到所需的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM