62

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

これはどういう意味ですか、何が原因で、それを修正するにはどうすればよいですか?

4

9 に答える 9

44

コマンドを使用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. メソッドはstatic 2でなければなりません。
  5. メソッドの戻り型はである必要がありますvoid
  6. メソッドには引数が1つだけ含まれている必要があり、引数の型はString[] 3である必要があります。

(引数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

または、非常に古いバージョンのJavaを実行している場合:

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

このエラーが発生した場合は、mainメソッドがあり、上記の6つの要件をすべて満たしていることを確認してください。


1-これの本当にあいまいなバリエーションの1つは、「メイン」の1つ以上の文字がLATIN-1文字ではなく、表示されたときに対応するLATIN-1文字のように見えるUnicode文字である場合です。
2-メソッドが静的である必要がある理由の説明は次のとおりです
3-標準クラスでStringある必要があり、標準java.lang.Stringクラスを非表示にしているという名前のカスタムクラスではありませんString

于 2011-03-23T15:30:02.737 に答える
14

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

それ

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

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

于 2011-03-23T15:04:27.703 に答える
8

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

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

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

于 2011-03-23T15:58:29.490 に答える
5

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

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

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

于 2013-03-12T16:04:32.700 に答える
3

例外の名前は、プログラムが存在しないメソッドを呼び出そうとしたことを示しています。このコンテキストでは、プログラムにメソッドがないように見えmainますが、エラーの原因となったコードとコードが実行されたコンテキストを投稿すると役立ちます。

.classこれは、ユーザーがファイルまたはメソッド.jarのないファイルを実行しようとした場合に発生した可能性がありますmain。Javaでは、mainメソッドがプログラムの実行を開始するためのエントリポイントです。

通常、コンパイラはこれが発生しないようにする必要があるため、これが発生した場合は、通常、呼び出されるメソッドの名前がコンパイル時ではなく実行時に決定されるためです。

この問題を修正するには、新しいプログラマーは、middingメソッドを追加するか(まだmain欠落していると想定して)メソッド呼び出しを存在するメソッドの名前に変更する必要があります。

ここでメインメソッドの詳細をお読みください:http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

于 2011-03-23T15:04:39.740 に答える
2

一般的に、それはあなたが実行しようとしているプログラムが「メイン」メソッドを持っていないことを意味します。Javaプログラムを実行する場合、実行されるクラスには次のmainメソッドが必要です。

たとえば、ファイルFoo.java

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

このプログラムはコンパイルして問題なく実行されるはずmainです。他の何かが呼び出された場合、または静的でない場合は、発生したエラーが発生します。

言語に関係なく、すべての実行可能プログラムには、インタプリタ、オペレーティングシステム、またはマシンに実行を開始する場所を指示するためのエントリポイントが必要です。Javaの場合、これは静的メソッドであり、コマンドライン引数を含むmainパラメーターが渡されます。このメソッドは、C言語args[]と同等です。int main(int argc, char** argv)

于 2011-03-23T15:12:38.807 に答える
0

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

java.lang.NoSuchMethodError: No virtual method

于 2015-02-27T16:19:58.510 に答える
0

VSCodeを使用している場合:

ここに画像の説明を入力してください

選択:ワークスペースのクリーン

ここに画像の説明を入力してください

選択:再起動して削除

コーディングを続ける:-)

于 2021-06-03T13:10:29.167 に答える
-1

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

  • すべての依存プロジェクト(alt + F5)でMavenの更新を行っただけです。

これで問題は解決しました。必要な結果を取得します。

于 2018-10-24T10:35:18.107 に答える