mainメソッドを理解する

mainはJavaアプリケーションを開始するときの入口です。呼出し可能な宣言の形と、起動コマンドから渡された文字列配列の読み方を学びます。コンパイルが通ることと起動入口が見つかることを区別します。

この単元で学ぶこと

  • Java 11の標準的なmain宣言を判断する
  • コマンドライン引数を文字列配列として追う
  • コンパイルエラーと起動エラーと実行時例外を区別する

本文解説

入口の完全な形 public class Main{public static void main(String[] args){System.out.print("Hi");}}をMain.javaへ保存します。javac Main.javaの後にjava Mainを実行するとHiを表示します。Java 11のこの起動形式では、mainの名前と引数型、public・static・voidという宣言が重要です。

publicとstatic publicは入口を外から呼び出せる形にし、staticはMainの実体をnewせずクラスを通じて呼び出すことに対応します。staticを除いたpublic void main(String[] args)は通常のインスタンスメソッドとしてコンパイルできても、この起動形式の入口にはなりません。

voidと戻り値 voidはmainが値を返さないことを表します。main内でreturn;により終了することはできますがreturn 3;とは書けません。整数を返す別のmainを宣言しても、標準ランチャーが探す入口とは異なります。

仮引数名は自由 String[] inputとして本体でinputを参照しても入口になります。argsは慣習的な名前で、予約された名前ではありません。String args[]という配列表記も同じ型です。publicとstaticの並び順を交換しても、この宣言は有効です。

引数配列の中身 java Main red blueならargs.lengthは2で、args[0]はred、args[1]はblueです。Mainは起動対象のクラス名であり配列には入りません。配列の添字は0から始まるので、最後の要素の位置はlength-1です。

引数なし java Mainだけならargsは要素数0の配列です。nullではありません。args.lengthは安全に0を返しますが、args[0]へアクセスすればArrayIndexOutOfBoundsExceptionになります。読み出す前に必要な個数を確認します。

数字も文字列 java Main 2 3でargs[0]+args[1]は文字列の23になります。Integer.parseInt(args[0])でintへ変換してから加算すると5です。変換できない文字列をparseIntへ渡すとNumberFormatExceptionなので、引数の形式も契約に含めます。

失敗する段階を分ける return 3をvoid mainに書く等の型違反はコンパイル時に拒否されます。mainの引数がString一つだけならメソッド自体は合法でも起動入口が見つかりません。正しいmain内で範囲外のargsを読む場合は、起動後に本体を実行して例外になります。

図解

起動引数がmainへ届くまで
起動クラス名は引数配列に含まれない。

重要ポイント

  • 標準的な入口はpublic static void main(String[] args)。
  • argsという仮引数名自体は変更できる。
  • クラス名より後の引数がargs[0]から格納される。
  • 数字の引数も最初はStringであり、必要なら変換する。

間違えやすい点

  • argsへクラス名が入ると思わない。
  • 引数なしのargsをnullとみなさない。
  • 通常メソッドとして有効なmainが必ず起動入口になると思わない。

用語解説

エントリーポイント
アプリケーションの実行を開始する入口。
コマンドライン引数
起動コマンドからプログラムへ渡す文字列。
ランチャー
クラスを起動し、所定のmainを呼び出すjavaコマンドの仕組み。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。