S-JIS[2025-09-18/2025-09-21] 変更履歴
Javaのmainメソッドについて。
|
Javaのアプリケーションを実行するとmainメソッドが呼ばれる。(mainという名前で特定のシグネチャーのメソッドから実行が開始される)
(厳密には、前処理用のpremainというメソッドもあり、mainメソッドが呼ばれる前に呼ばれる)
もう少し具体的な例で言うと、Exampleクラスがあるとき、javaコマンドでExampleクラスを指定して実行すると、Exampleクラスのmainメソッドが呼ばれる。
java Example ←Exampleクラスの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メソッドの引数は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メソッドの戻り値の型はvoidである。つまり、戻り値を返せない。
(C言語だとmain関数の戻り値がアプリケーションのリターンコードになるが、Javaでは異なる)
Javaでアプリケーションのリターンコードを返したい場合は、「System.exit(int)
」を呼び出す。
ただし、System.exit()を呼ぶとその場でアプリケーションが終了する。finallyブロックも実行されないしユーザースレッドも強制終了されるしGCも呼ばれないらしいので、注意して使う必要がある。
通常は、ユーザースレッド(非デーモンスレッド)が全て終わるまで、(mainメソッドが終わっていても)Javaアプリケーションは終了しない。
mainメソッドからリターンコードを返せるようになっていないのは、ユーザースレッドが全て終わるまでアプリケーションが終了しないから(一番最後に終わるのがmainメソッドとは限らないから)のようだ。
ちなみに、例外が発生して(mainメソッドから例外をスローして)終了すると、アプリケーションのリターンコードは1になる。
mainメソッドの例。
パターン | 例 | 備考 |
---|---|---|
基本 | public class Main { |
Main.javaというソースファイルにMainクラスとmainメソッドを定義する例。 |
可変長引数 (Java5以降) |
public class Main { |
|
mainメソッドのpublic・staticを省略 (Java25以降) |
public class Main { |
|
mainメソッドの引数を省略 (Java25以降) |
public class Main { |
|
mainメソッドのpublic・static・引数を省略 (Java25以降) |
public class Main { |
|
クラス定義を省略 (Java25以降) |
public static void main(String[] args) { |
クラス定義を省略してmainメソッドを書くと、暗黙のクラスが定義される。 Main.javaに書いている場合、コンパイルするとMain.classが生成される。 (ファイル名と同名のクラスが生成される) ちなみに、暗黙のクラスを使う場合はjava.baseモジュールが暗黙にインポートされるそうだ。 |
最小限 (Java25以降) |
void main() { |