Javaのmainメソッドを public static void にしなかったらどうなるかやってみた。

Javaのmainメソッドを記載するとき、public static void main( String[ ] args ) { . . . と記載しますが、mainメソッドにpublicやstaticがなかったり、戻り値がvoid型でなかった場合にどうなるか?をやってみました。

Javaの実行環境はLinuxで、バージョンはJava8です。

サンプルソースです。


package sample08;

public class MainSample {

	public static void main( String[] args ) {

		System.out.println("Hello.");

	}
}

これを実行すると、画面に「Hello.」と表示されます。

mainメソッドのpublicを外してみました。
public static void main ⇒ static void main にしました。


package sample08;

public class MainSample {

	static void main( String[] args ) {

		System.out.println("Hello.");

	}
}

結果は、コンパイルはできましたが実行はできませんでした。

実行時の出力です。


$ java sample08.MainSample 
エラー: メイン・メソッドがクラスsample08.MainSampleで見つかりません。次のようにメイン・メソッドを定義してください。
   public static void main(String[] args)
またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要があります

mainメソッドのアクセス修飾子にはpublicが必要とのこと。

mainメソッドのstaticを外してみました。
public static void main ⇒ public void main にしました。


package sample08;

public class MainSample {

	public void main( String[] args ) {

		System.out.println("Hello.");

	}
}

結果は、コンパイルはできましたが実行はできませんでした。

実行時の出力です。


$ java sample08.MainSample 
エラー: メイン・メソッドがクラスsample08.MainSampleのstaticではありません。次のようにメイン・メソッドを定義してください。
   public static void main(String[] args)

mainメソッドにはstatic句の指定が必須のようです。

MainSampleクラス(mainメソッドがあるクラス)のインスタンスを生成するクラスがないから、インスタンスの生成なしで外部からmainメソッドを呼べるようにstaticである必要があるのでしょう。また外部から呼べるようにpublicとする必要があるのかと思いました。

クラスのアクセス修飾子であるpublicを外してみました。
public class MainSample ⇒ class MainSample にしました。


package sample08;

class MainSample {

	public static void main( String[] args ) {

		System.out.println("Hello.");

	}
}

結果は、コンパイルできて実行もできました。mainメソッドがあるクラスのアクセス修飾子は無指定でも良いようです。

クラスのアクセス修飾子が無指定でも実行できたということは、mainメソッドを呼ぶ人(おそらくJavaのVM)はどのパッケージにあるクラスでもアクセスできるということかと思います。

戻り値のvoidもintに変更してみました。
public static void main ⇒ public static int main にしました。


package sample08;

public class MainSample {

	public static int main( String[] args ) {

		System.out.println("Hello.");
		return 1;

	}
}

結果は、コンパイルはできましたが実行はできませんでした。

実行時の出力です。


$ java sample08.MainSample 
エラー: メイン・メソッドはクラスsample08.MainSampleのvoid型の値を返す必要があります。
次のようにメイン・メソッドを定義してください。
   public static void main(String[] args)

mainメソッドの戻り値はvoid型でないとダメなようです。なぜvoid以外の戻り値を許可していないのかは不明です。

でもそうするとJavaの結果は呼び出し元に返せないのかと思ってしまうのですが、戻り値を返すメソッドがありました。

System.exit()を記載すれば、呼び出し元にリターンコードを返せるようです。以下のようにします。


package sample08;

public class MainSample {

	public static void main( String[] args ) {

		System.out.println("Hello.");
		System.exit(255);
		
	}
}

このようにすると呼び出し元に255のリターンコードが返されます。

$ java sample08.MainSample
Hello.
$ echo $?
255

mainメソッドの引数ですが、String[] args となっています。これはmainメソッドの仕様でしょう。試しに String[] args ⇒ String args としたところ実行時にエラーとなりました。

ということで、Javaのmainメソッドは、

public static void main( String[ ] args ) { . . .

とするしかないようです。mainメソッドのあるクラスのアクセス修飾子はpublicがなくても大丈夫です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です