mainメソッドのコードトレース

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

この単元で学ぶこと

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

本文解説

引数を順に走査する java Main A B Cでfor(String s:args){System.out.print(s);}を実行するとABCです。拡張forは配列内の順序で要素を読みます。標準入力から後で入力する文字列と、起動時に渡したargsは別の入力経路です。

最後の要素を読む args[args.length-1]は長さが1以上なら最後の引数を指します。java Main a b cならcです。空配列ではlength-1が-1になるため、最後の要素を読む処理の前に個数を検査します。

長さと文字数を分ける java Main appleならargs.lengthは1ですがargs[0].length()は5です。前者は配列の要素数、後者は文字列の長さです。配列のlengthに括弧はなく、Stringのlength()はメソッド呼出しで括弧を付けます。

配列はmain内で変更できる args[0]="X"とすれば、その後のargs[0]はXになります。これは起動コマンドそのものを書き換える意味ではなく、渡された配列の要素へ新しい参照を代入する処理です。別名の配列変数へ代入しても同じ配列を共有します。

mainのオーバーロード public static void main(String[])に加えてmain(int)を宣言できます。ランチャーが選ぶのはString[]版で、int版はコードから明示的に呼んだときに動きます。java Main 3という数値に見える引数でもint版へ切り替わりません。

可変長引数の入口 public static void main(String... args)は配列パラメータとして扱われ、この起動の入口になります。これは引数を個々の仮引数へ宣言し直す仕組みではありません。main内ではargs.lengthやargs[i]という配列操作を使います。

static文脈でのアクセス mainはstaticなので、クラスのインスタンスフィールドnを受け手なしで直接読めません。Main m=new Main();m.nのように実体を用意するか、共通状態として適切なstaticフィールドを宣言する必要があります。コンパイル時の問題であり引数内容には依存しません。

引数検査から処理へ if(args.length<2){return;}のように個数を確かめてから読み出します。ただし個数が足りていても"x"をparseIntすることはできません。個数の検査、文字列の形式、数値へ変換した後の処理を別々に追うと例外の発生点を特定できます。

図解

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

重要ポイント

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

間違えやすい点

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

用語解説

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

関連教材

参考資料

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

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