Javaのmainについて基本から解説!|mainメソッドを正しく使いこなそう

- SE
- Javaのmainとはどのようなものでしょうか。
- PM
- Javaのmainと言えばmainメソッドのことです。Javaを実行すると、まずこのmainメソッドが実行されます。
この記事でわかること
Javaのmainとは?
Javaのmainと言えばmainメソッドのことです。Javaを実行すると、まずこのmainメソッドが実行されます。mainメソッドがないJavaのプログラムは、以下のようなエラーが出て実行できません。
“”エラー: メイン・メソッドがクラスMainClassで見つかりません。次のようにメイン・メソッドを定義してください。
public static void main(String[] args)””
なぜmainと言う名前なのかといえば、C言語などの古い言語のmain関数の仕様を引き継いでいることによります。プログラムを上から記述した順に実行する言語も多いのですが、JavaはC言語の後継を目指した言語なのでC言語寄りなのです。
mainメソッドの決まり事
mainメソッドは以下のような決まり事があります。
・クラスの中に記述すること
・public static voidのメソッドであること
・名前はmainであること(Mainは不可)
・メソッドの引数はStringの配列であること
クラスの中に記述すること、はmainメソッドに限りません。Javaの全てのメソッドはクラスに属する必要があります。引数の変数名はargsとすることが多いですが、別の名前でもかまいません。
mainメソッドの様々な書き方
Javaのmainメソッドは上のルール通りの以下の記述が一般的です。
public static void main(String[] args) {
}
引数は可変引数の…を使用することも可能です。
public static void main(String… args) {
}
オーバーライドを禁止するfinalを付けたり、例外を発生する宣言のthrowsを付けても、ルールを満たしていれば問題ありません。
public final static void main(String[] args) throws Exception {
}
mainメソッドの変わった記述
もしmainメソッドを以下のように引数を変えてオーバーロードした場合、上のルールに沿ったmainメソッドが呼ばれます。
public static void main(String[] args) {
System.out.println(“”これが呼び出されます。””);
}
public static void main(String args) {
}
public static void main(int[] args) {
}
またmainメソッドは普通のクラスではなく、abstractクラスやinterface、enumでも問題なく呼ばれます。ただこのようなトリッキーな事はしない方が良いでしょう。
interface MainInterface {
public static void main(String[] args) {
}
}
mainの引数を利用するには?
mainメソッドの引数のString配列はどのように使うのでしょうか。Javaをコマンドラインから実行した場合、以下のように引数を渡すことができます。
java MainClass パラメータ1 パラメータ2 パラメータ3
public class MainClass {
public static void main(String[] args) {
for (String s : args) {
System.out.println(s);
}
}
}
実行結果は
パラメータ1
パラメータ2
パラメータ3
となります。
Eclipseでも引数を渡せる
Eclipseで行う場合は、上のメニューのRun→Run ConfigurationsでmainのあるクラスのArgumentsタブを選択し、Program argumentsに記述することで引数を渡せます。
これを利用すれば、プログラムをいじらずに様々なモードで起動したりと、便利に活用できます。
なおmainに引数を渡さない場合は、長さ0のString配列になります。nullではありません。また引数に数字を渡しても、文字列として扱うことになります。
mainメソッドの終わらせ方
Javaのmainメソッドを終わらせるにはどうしたらよいのでしょうか。簡単な方法は、returnを使うことです。
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
if (i==3) return;
System.out.println(i+””回目のループ””);
}
}
実行すると、以下のようになります。returnで終わります。
0回目のループ
1回目のループ
2回目のループ
System.exitなら戻り値を渡せる
Javaのmainメソッドを終わらせる他の方法は、System.exitを使うことです。これはmainメソッド以外の場所でも即時で終了することができて、さらに終了時に値を渡すことが出来ます。
public static void main(String[] args) {
System.exit(123);
}
Eclipseの場合、Debugタブで以下のように戻り値が表示されます。
<terminated, exit value: 123>
終了処理の実行の方法
exitでmainを終了する前に、以下のようにaddShutdownHookで終了処理を行うことが出来ます。
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(
new Thread(() -> System.out.println(“”終了処理を行います。””)));
Runtime.getRuntime().exit(123);
}
実行すると、以下のように表示して終了します。
終了処理を行います。
haltでは終了処理は実行されない
上のJavaサンプルのRuntime.getRuntime().exitは、System.exitでも同様に終了処理を実行できます。しかし、以下のようにhaltを使用すると、mainは終了しますが、addShutdownHookによる終了処理は実行されません。
Runtime.getRuntime().halt(123);
haltは緊急停止用のメソッドということになります。
JavaのMainクラス
JavaにはMainというクラスがあります。これを使うと、javaファイルをコンパイルしてclassファイルを作ることが出来ます。以下が例です。
-verboseを指定してコンパイルの内部の動作を表示しています。
import com.sun.tools.javac.Main;
public class MainClass {
public static void main(String[] args) throws Exception {
String[] param = new String[] {“”c:\\test\\TestClass.java””, “”-verbose””};
Main.main(param);
}
}
Mainクラスは現在では使用しない
上のJavaサンプルを実行すると、TestClass.javaがコンパイルされ、TestClass.classが作られます。TestClass.javaにエラーがある場合はエラーメッセージが出ます。
ただし現在はJavaでJavaをコンパイルする場合は、MainクラスではなくJava Compiler APIを使用することが推奨されています。Mainクラスは過去のアプリケーションとの互換性のためだけに残されています。
- SE
- Javaのmainについてよく理解できました。
- PM
- mainを使用しないケースもあることを理解した上で、Javaのmainを実践で使用してみましょう。
mainメソッドはJavaの基本
Javaのmainメソッドについて解説しましたが、ご理解頂けましたでしょうか。mainメソッドはJavaを動かすための全ての始まりで、エントリーポイントと言われます。
記事の内容については、しっかり把握しておきましょう。