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を読む場合は、起動後に本体を実行して例外になります。
図解
重要ポイント
- 標準的な入口はpublic static void main(String[] args)。
- argsという仮引数名自体は変更できる。
- クラス名より後の引数がargs[0]から格納される。
- 数字の引数も最初はStringであり、必要なら変換する。
間違えやすい点
- argsへクラス名が入ると思わない。
- 引数なしのargsをnullとみなさない。
- 通常メソッドとして有効なmainが必ず起動入口になると思わない。
用語解説
- エントリーポイント
- アプリケーションの実行を開始する入口。
- コマンドライン引数
- 起動コマンドからプログラムへ渡す文字列。
- ランチャー
- クラスを起動し、所定のmainを呼び出すjavaコマンドの仕組み。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。