新しいJavaプログラマーは、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
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(String[] args) {
// body of main method follows
...
}
}
エントリポイントメソッドの特定の要件は次のとおりです。
public
でなければなりません。static
でなければなりません 2。void
でなければなりません。String[]
でなければなりません 3。(引数may varargs構文を使用して宣言します。例:String... args
。詳細については この質問 を参照してください。String[]
引数は、コマンドラインからの引数。アプリケーションがコマンドライン引数を受け取らない場合でも必要です。
上記の要件のいずれかが満たされていない場合、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
または、extremely古いバージョンのJavaを実行している場合:
Java.lang.NoSuchMethodError: main
Exception in thread "main"
このエラーが発生した場合は、main
メソッドがあり、上記の6つの要件をすべて満たしていることを確認してください。
1-「main」の1つ以上の文字がLATIN-1文字ではなく、likes対応するLATIN-1文字であるUnicode文字表示されるとき。
2-メソッドが静的である必要がある理由の説明については、 なぜJava mainメソッドが静的なのか を参照してください。
3-String
は、String
という名前のカスタムクラスではなく、Java.lang.String
に対応している必要があります。
問題は、呼び出そうとするクラスにpublic void main(String[] args)
メソッドがないことです。
それ
static
でなければなりません実際には既存のクラスを指定していることに注意してください(そうでなければエラーは異なります)が、そのクラスにはmainメソッドがありません。
他の回答は、main
の要件を要約するのに適しています。これらの要件が文書化されている場所への参照を収集したいと思います。
最も信頼できるソースは、VM
仕様です(第2版を引用)。 main
は言語機能ではないため、Java言語仕様では考慮されていません。
もう1つの優れたリソースは、アプリケーションランチャー自体のドキュメントです。
正しいクラスを実行していて、メインが適切に定義されている場合は、同じパッケージにStringというクラスが定義されているかどうかも確認してください。このStringクラスの定義が考慮され、main(Java.lang.String[] args)
に確認されないため、同じ例外が発生します。
パッケージ内のライブラリJavaクラスを非表示にしないことをお勧めします。
例外の名前は、プログラムが存在しないメソッドを呼び出そうとしたことを示しています。このコンテキストでは、プログラムにmain
メソッドがないように聞こえますが、エラーの原因となったコードとコードが実行されたコンテキストを投稿すると役立ちます。
これは、ユーザーが.class
ファイルまたはmain
メソッドを持たない.jar
ファイルを実行しようとした場合に発生した可能性があります。Javaでは、main
メソッドがエントリポイントです。プログラムの実行を開始します。
通常、コンパイラはこれを防ぐようになっているため、これが発生した場合、通常は、呼び出されるメソッドの名前がコンパイル時ではなく実行時に決定されるためです。
この問題を解決するには、新しいプログラマーは、Midingメソッドを追加する必要があります(main
が欠落していると仮定)またはメソッド呼び出しを変更する存在するメソッドの名前に。
メインメソッドの詳細については、こちらをご覧ください。 http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html
一般に、実行しようとしているプログラムに「メイン」メソッドがないことを意味します。 Javaプログラムを実行する場合、実行するクラスにはmain
メソッドが必要です
たとえば、ファイルFoo.Java
public class Foo {
public static void main(args[]) {
System.out.println("hello");
}
}
このプログラムはコンパイルして問題なく実行する必要があります。main
が他の名前で呼び出された場合、または静的でない場合、エラーが発生します。
言語に関係なく、すべての実行可能プログラムには、インタープリター、オペレーティングシステム、またはマシンに実行を開始する場所を伝えるエントリポイントが必要です。 Javaの場合、これは静的メソッドmain
であり、コマンドライン引数を含むパラメーターargs[]
が渡されます。
Cのint main(int argc, char** argv)
と同等です
上記の回答では、コードにmain()がある場合でもこのエラーが発生するシナリオを見逃しています。 Reflection を使用してメソッドを呼び出すJNIを使用している場合。実行時にメソッドが見つからない場合は、
Java.lang.NoSuchMethodError: No virtual method
「メインメソッドが定義されていません」に直面していました。上記のすべてを試してみましたが、何も機能しませんでした。Javaファイルにコンパイルエラーはありませんでした。私は以下のことを行いました
これで問題は解決し、必要な結果が得られました。