![](/img/trans.png)
[英]Error: Main method not found in class Main, please define the main method
[英]"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
...
}
}
入口點方法的具體要求是:
public
。static
的2 。void
。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
的要求方面做得很好。 我想收集有關記錄這些要求的參考資料。
最權威的來源是VM
規范(引用的第二版)。 由於main
不是語言特性,Java 語言規范中沒有考慮它。
另一個很好的資源是應用程序啟動器本身的文檔:
如果您正在運行正確的類並且 main 定義正確,還要檢查您是否在同一個包中定義了一個名為 String 的類。 將考慮 String 類的這個定義,因為它沒有與main(java.lang.String[] args)
確認,你會得到同樣的異常。
建議永遠不要在包中隱藏庫 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
對於那些在Kotlin 項目中遇到這個問題的人。
您可以嘗試刪除 .idea 文件夾並再次運行該項目 - 對我來說它解決了這個問題。 (最好先關閉 IntelliJ)
似乎有時 IntelliJ 對主要方法簽名感到困惑,並期待 java 簽名而不是 Kotlin 簽名。
幾分鍾后,我面臨“未定義主要方法”。現在它已解決。我嘗試了以上所有方法,但沒有任何效果。我的 java 文件中沒有編譯錯誤。 我跟着下面的事情
現在問題解決了。得到所需的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.