web-dev-qa-db-ja.com

「エラー:クラスMyClassでメインメソッドが見つかりません。メインメソッドを次のように定義してください...」

新しい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"

これは何を意味し、何を引き起こす可能性があり、それを修正するために何をすべきですか?

56
Stephen C

Javaコマンドを使用して、コマンドラインからJavaアプリケーションを実行する場合、たとえば、

Java some.AppName arg1 arg2 ...

コマンドは、指定したクラスをロードし、mainというエントリポイントメソッドを探します。具体的には、次のように宣言されているメソッドを探しています。

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

エントリポイントメソッドの特定の要件は次のとおりです。

  1. メソッドは、指定されたクラス内になければなりません。
  2. メソッドの名前は「main」で、exactlyが大文字である必要があります1
  3. メソッドはpublicでなければなりません。
  4. メソッドはstaticでなければなりません 2
  5. メソッドの戻り値の型はvoidでなければなりません。
  6. メソッドには引数が1つだけ必要で、引数のタイプは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に対応している必要があります。

37
Stephen C

問題は、呼び出そうとするクラスにpublic void main(String[] args)メソッドがないことです。

それ

  • staticでなければなりません
  • 文字列配列引数を1つだけ持つ必要があります(任意の名前を付けることができます)
  • 小文字でm-a-i-nを綴る必要があります。

実際には既存のクラスを指定していることに注意してください(そうでなければエラーは異なります)が、そのクラスにはmainメソッドがありません。

他の回答は、mainの要件を要約するのに適しています。これらの要件が文書化されている場所への参照を収集したいと思います。

最も信頼できるソースは、VM仕様です(第2版を引用)。 mainは言語機能ではないため、Java言語仕様では考慮されていません。

もう1つの優れたリソースは、アプリケーションランチャー自体のドキュメントです。

8
Mark Peters

正しいクラスを実行していて、メインが適切に定義されている場合は、同じパッケージにStringというクラスが定義されているかどうかも確認してください。このStringクラスの定義が考慮され、main(Java.lang.String[] args)に確認されないため、同じ例外が発生します。

  • コンパイラは、ユーザーがカスタムmainメソッドを定義していると想定しているだけなので、コンパイル時のエラーではありません。

パッケージ内のライブラリJavaクラスを非表示にしないことをお勧めします。

5
bschandramohan

例外の名前は、プログラムが存在しないメソッドを呼び出そうとしたことを示しています。このコンテキストでは、プログラムに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)と同等です

1
Magnus

上記の回答では、コードにmain()がある場合でもこのエラーが発生するシナリオを見逃しています。 Reflection を使用してメソッドを呼び出すJNIを使​​用している場合。実行時にメソッドが見つからない場合は、

Java.lang.NoSuchMethodError: No virtual method

0
likejudo

「メインメソッドが定義されていません」に直面していました。上記のすべてを試してみましたが、何も機能しませんでした。Javaファイルにコンパイルエラーはありませんでした。私は以下のことを行いました

  • 単純にすべての依存プロジェクト(alt + F5)でmavenを更新しました。

これで問題は解決し、必要な結果が得られました。

0