Javaコラム Javaエンジニアのためのお役立ちコラム

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

 
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を動かすための全ての始まりで、エントリーポイントと言われます。

記事の内容については、しっかり把握しておきましょう。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags