Code Fix

初級

Main method not found in class の原因と直し方

コンパイルは通るのに実行できない典型。JVMがmainを見つける条件を1つずつ確認します。

エラーメッセージの読み方

Error: Main method not found in class Main
Main method not found in class Main
JVM起動時のエラー — コンパイルは成功しています

このエラーが出る典型パターン

パターン1

 1  public class Main {
 2      public static void Main (String[] args) {
                             ^
 3          System.out.println("Hello");
 4      }
 5  }
Error: Main method not found in class Mainexited with code 1

JVMは起動時にmainという名前のメソッドを探します。コンパイルは通るため、実行して初めて失敗します。

直し方: Main を main にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  public class Main {
 2      public              void main(String[] args) {
                     ^
 3          System.out.println("Hello");
 4      }
 5  }
Error: Main method is not static in class Mainexited with code 1

mainはインスタンスを作る前に呼ばれるので、staticでなければなりません。

直し方: (空) を static にします。

この問題を解いてみる →

パターン3

 1  public class Main {
 2      public static void main(String   args) {
                                    ^
 3          System.out.println("Hello");
 4      }
 5  }
Error: Main method not found in class Mainexited with code 1

引数はString配列でなければmainとして認識されません。コマンドライン引数を受け取るための決まった形です。

直し方: String を String[] にします。

この問題を解いてみる →

パターン4

 1  public class Main {
 2      public static void main(String[] args, int x       ) {
                                                    ^
 3          System.out.println("Hello");
 4      }
 5  }
Error: Main method not found in class Mainexited with code 1

エントリーポイントとして認識されるのはString[]単独の引数を持つmainだけです。余分な引数があると別のメソッドとして扱われ、起動時に見つかりません。

直し方: , int x を (空) にします。

この問題を解いてみる →

パターン5

 1  public class Main {
 2      private   static void main(String[] args) {
            ^
 3          System.out.println("Hello");
 4      }
 5  }
Error: Main method not found in class Mainexited with code 1

エントリーポイントはpublicでなければなりません。privateだとコンパイルは通っても、クラス外のJVMからは呼び出せません。

直し方: private を public にします。

この問題を解いてみる →

よくある誤解

「コンパイルが通った=正しい」ではありません。mainの綴りミスは実行時まで発覚しない代表例です。

実務での勘所

JVMがmainを呼び出す条件は、シグネチャの文字列を機械的に照合しているだけです。publicが無いとJVMから見えず、staticが無いとインスタンスを作らずに呼び出せず、引数の型がString[]と違えば別のメソッドとして扱われます。3つのうち1つでも欠けると、コンパイルは通るのに実行だけが失敗するという分かりにくい状態になります。なお、String[] argsの代わりにString... args(可変長引数)と書いても同じシグネチャとして認識されます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)