S-JIS[2025-09-18/2025-09-21] 変更履歴

Java mainメソッド

Javaのmainメソッドについて。


概要

Javaのアプリケーションを実行するとmainメソッドが呼ばれる。(mainという名前で特定のシグネチャーのメソッドから実行が開始される)
(厳密には、前処理用のpremainというメソッドもあり、mainメソッドが呼ばれる前に呼ばれる)

もう少し具体的な例で言うと、Exampleクラスがあるとき、javaコマンドでExampleクラスを指定して実行すると、Exampleクラスのmainメソッドが呼ばれる。

java ExampleExampleクラスのmainメソッドが呼ばれる

基本的には、mainメソッドのシグネチャー(修飾子や引数の型)は「public static void main(String[] args)」である。
(こういう形式のmainメソッドでないと、開始時に呼ばれない。別の言い方をすると、他のシグネチャーであればmainというメソッド名を自由に使うことが出来る)

Java5(可変長引数導入後)から、引数の型は「String...」にすることも出来るようになった。
すなわち、「public static void main(String... args)」と書いても良い。

Java25(プレビュー版ではJava21〜24)では、さらにmainメソッドの書き方を省略できるようになった。
public static」や引数を省略することが出来る。
すなわち、「void main(String[] args)」や「public static void main()」、さらに「void main()」と書くことが出来る。

static」を省略した場合は、そのクラスに、privateでないデフォルトコンストラクター(引数が無いコンストラクター)が必要になる。[2025-09-21]
(コンストラクターを全く記述していない場合は、publicなデフォルトコンストラクターが暗黙に生成されるので、問題ない)


なお、mainメソッドにthrows句は自由に付けることが出来る。


mainメソッドの引数

mainメソッドの引数はStringの配列である。普通は変数名をargsにする。

javaコマンドの引数として指定された文字列がargsに入ってくる。
(C言語だとmain関数の引数の先頭は起動したプログラムのコマンド名だが、Javaでは異なる)


java Example a b c

args.length → 3
args[0] → a
args[1] → b
args[2] → c


mainメソッドの戻り値

mainメソッドの戻り値の型はvoidである。つまり、戻り値を返せない。
(C言語だとmain関数の戻り値がアプリケーションのリターンコードになるが、Javaでは異なる)

Javaでアプリケーションのリターンコードを返したい場合は、「System.exit(int)」を呼び出す。
ただし、System.exit()を呼ぶとその場でアプリケーションが終了するfinallyブロックも実行されないしユーザースレッドも強制終了されるしGCも呼ばれないらしいので、注意して使う必要がある。

通常は、ユーザースレッド(非デーモンスレッド)が全て終わるまで、(mainメソッドが終わっていても)Javaアプリケーションは終了しない。
mainメソッドからリターンコードを返せるようになっていないのは、ユーザースレッドが全て終わるまでアプリケーションが終了しないから(一番最後に終わるのがmainメソッドとは限らないから)のようだ。

ちなみに、例外が発生して(mainメソッドから例外をスローして)終了すると、アプリケーションのリターンコードは1になる。


mainメソッドの例。

パターン 備考
基本 public class Main {
  public static void main(String[] args) {
    System.out.println("main " + args.length);
  }
}
Main.javaというソースファイルにMainクラスとmainメソッドを定義する例。
可変長引数
(Java5以降)
public class Main {
  public static void main(String... args) {
    System.out.println("main " + args.length);
  }
}
 
mainメソッドのpublic・staticを省略
(Java25以降)
public class Main {
  void main(String[] args) {
    IO.println("main " + args.length);
  }
}
 
mainメソッドの引数を省略
(Java25以降)
public class Main {
  public static void main() {
    IO.println("main");
  }
}
 
mainメソッドのpublic・static・引数を省略
(Java25以降)
public class Main {
  void main() {
    IO.println("main");
  }
}
 
クラス定義を省略
(Java25以降)
public static void main(String[] args) {
  IO.println("main " + args.length);
  IO.println(getClass());
}
クラス定義を省略してmainメソッドを書くと、暗黙のクラスが定義される。
Main.javaに書いている場合、コンパイルするとMain.classが生成される。
(ファイル名と同名のクラスが生成される)

ちなみに、暗黙のクラスを使う場合はjava.baseモジュールが暗黙にインポートされるそうだ。

最小限
(Java25以降)
void main() {
  IO.println(getClass());
}

Java目次へ戻る / 新機能へ行く / 技術メモへ戻る
メールの送信先:ひしだま