6日でできる 新Java入門|main()メソッド

main()メソッドを理解すると、Javaプログラムの「始まり方」がはっきり見えてくる

Javaの学習を進めていくと、ほとんどのサンプルプログラムで見かけるのが main()メソッド です。
最初のうちは、決まり文句のように書いているだけで、なぜ必要なのか、なぜこの形なのかが少し見えにくいかもしれません。

でも、main()メソッドの役割が分かると、Javaプログラム全体の動き方がぐっと理解しやすくなります。Javaのアプリケーションは、基本的にこの main()メソッド を入口として実行が始まります。言いかえると、main()メソッド はプログラムのスタート地点です。

さらに、main()メソッド は、ただ処理を始めるだけの場所ではありません。String[] args を通して実行時の情報を受け取ったり、System.exit() で終了のしかたを制御したり、補助メソッドを呼び出してヘルプを表示したりと、実用的なプログラムを作るうえで大事な役割をたくさん持っています。

この記事では、main()メソッド の基本の形から始めて、コマンドライン引数の受け取り方、引数を使った実践例、System.exit() の意味、そしてヘルプ機能の作り方まで、順番にやさしく見ていきます。

main()メソッドはJavaプログラムの出発点

Javaアプリケーションでは、プログラムの実行開始位置として main()メソッド が使われます。
JVM は、実行対象のクラスの中から main()メソッド を探し、そこから処理を開始します。

つまり、main()メソッド がないと、Javaのアプリケーションとしては「どこから始めればいいのか」が分からない状態になります。

学習の最初は、main()メソッド はおまじないのように感じることもありますが、実際にはとても明確な役割があります。

項目役割
main()メソッドJavaアプリケーションの開始地点
String[] args実行時に渡された文字列の情報を受け取る
JVMmain()メソッド を見つけて実行を始める

この「Javaプログラムは main() から始まる」という感覚は、今後クラス設計やメソッド学習を進めていくうえでも大切です。

main()メソッドの書式を見てみよう

main()メソッド の基本形は、次のように書きます。

public static void main(String[] args)

この1行には、それぞれ意味があります。
ひとつずつ見ると、かなり分かりやすくなります。

要素意味
publicどこからでも呼び出せる
staticオブジェクトを作らなくてもクラスから直接呼び出せる
void戻り値を返さない
mainメソッド名。Javaアプリの開始点として使われる
String[] args実行時の引数を文字列配列で受け取る

ここで特に大事なのは、Javaが決まった形の main()メソッド を探すという点です。
名前や引数の形が大きく違うと、開始地点として認識されません。

最小のmain()メソッド

まずは、いちばんシンプルな例を見てみましょう。

ファイル名:lesson25_1.java

public class lesson25_1 {
    public static void main(String[] args) {
        System.out.println("こんにちは、Javaの世界!");
    }
}

実行結果

こんにちは、Javaの世界!

このプログラムでは、main()メソッド の中に1行だけ処理が書かれています。
流れとしてはとてもシンプルで、JVM が main()メソッド を見つける → その中の System.out.println(...) を実行する、という形です。

この例から分かるのは、main()メソッド は「Javaの処理が始まる場所」だということです。
どれだけ大きなプログラムでも、最初の入口としての役割は変わりません。

図:main()メソッドの役割と構成

↓クリックすると拡大表示されます。

この図が示していること

Javaプログラムが、JVM によって main()メソッド から実行開始されることと、main() の構文を構成する各要素の意味を示しています。

この図から分かること

main()メソッド は単なる決まり文句ではなく、Javaアプリケーションの開始地点として、明確な役割を持った構文であることが分かります。

String[] args は何を受け取るのか

main()メソッド の引数である String[] args には、実行時に渡された値が入ります。
ここでいう「引数」は、プログラムを起動するときに後ろへ付ける追加情報のことです。

たとえば、次のように実行するとします。

java Hello arg1 arg2

このとき args の中身は次のようになります。

添字内容
args[0]arg1
args[1]arg2

この仕組みを使うと、ソースコードを書き換えなくても、実行時に動作を変えられます。
つまり、main()メソッド は「実行時の設定値の受け取り口」としても使えるわけです。

コマンドライン引数が便利な理由

コマンドライン引数の便利さは、プログラムを柔軟に動かせるところにあります。
たとえば、毎回違う数値で計算させたり、問題数を変えたり、ヘルプ表示だけを行ったりできます。

使い方できること
数値を渡す計算対象を変えられる
オプションを渡す設定を切り替えられる
-h を渡す使い方を表示できる

この考え方は、実用的なプログラムではとてもよく使われます。
同じプログラムでも、引数しだいで動作が変わるようにしておくと、とても使いやすくなります。

引数を使って計算する例

ここでは、2つの整数を受け取り、その差を表示する例を見ていきます。

ファイル名:lesson25_2.java

public class lesson25_2 {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("使い方: java lesson25_2 <数値1> <数値2>");
            System.exit(1);
        }

        int x = Integer.parseInt(args[0]);
        int y = Integer.parseInt(args[1]);

        System.out.println(x + " - " + y + " = " + (x - y));
    }
}

コマンドラインで実行する場合

java lesson25_2 10 4

実行結果

10 - 4 = 6

引数不足時の実行例

java lesson25_2 10

実行結果

使い方: java lesson25_2 <数値1> <数値2>

Eclipseで実行する場合

メニューの 実行 → 実行構成 を開きます。

その中の 引数 タブで、プログラムの引数 に 「10 4」 を入力して実行します。

このプログラムの見どころ

このコードには、main()メソッド の大事な考え方がいくつも入っています。

コード意味
args.length != 2引数の数が正しいか確認している
Integer.parseInt(args[0])文字列を int に変換している
System.exit(1)引数不足なので異常終了している

特に覚えておきたいのは、args の中身はすべて文字列だということです。
たとえ 10 や 4 を渡しても、最初は String として受け取ります。
そのため、計算に使うには Integer.parseInt(...) で int に変換する必要があります。

args.length はとても大事

引数を扱うときは、まず args.length を確認するのが基本です。
理由は、必要な数の引数が来ていない状態で args[0] や args[1] を読み取ろうとすると、エラーになるからです。

たとえば、lesson25_2.java で最初に引数の個数をチェックしているのは、安全のためです。

状態結果
引数が2個ある正常に計算できる
引数が1個しかない使い方を表示して終了する
引数が0個同じく使い方を表示して終了する

このように、main()メソッド の引数は便利ですが、必ず「期待した形で渡されているか」を確認する必要があります。

オプション形式の引数とは

実用的なプログラムでは、単純に数値を順番に並べるだけでなく、オプション形式で引数を渡すことがよくあります。
たとえば、-n で問題数、-c で選択肢数、-h でヘルプ表示、という形です。

この書き方のよいところは、引数の意味が分かりやすいことです。

オプション役割
-n 値問題数を指定する
-c 値選択肢数を指定する
-hヘルプを表示する

このような形式にしておくと、実行時に設定を変えやすくなります。
しかも、ソースコードを書き換えて再コンパイルする必要がないので、とても柔軟です。

オプション形式を処理する例

ファイル名:lesson25_3.java

public class lesson25_3 {
    public static void main(String[] args) {
        int questions = 10;
        int choices = 4;

        for (int i = 0; i < args.length; i++) {
            if (args[i].equals("-n")) {
                questions = Integer.parseInt(args[++i]);
            } else if (args[i].equals("-c")) {
                choices = Integer.parseInt(args[++i]);
            } else if (args[i].equals("-h")) {
                help();
            } else {
                help();
            }
        }

        System.out.println("問題数: " + questions + ", 選択肢数: " + choices);
    }

    static void help() {
        System.out.println("使い方: java lesson25_3 [-n 問題数] [-c 選択肢数] [-h]");
        System.exit(1);
    }
}

コマンドで実行する場合

java lesson25_3 -n 12 -c 5

実行結果

問題数: 12, 選択肢数: 5

ヘルプ表示の実行例

java lesson25_3 -h

実行結果

使い方: java lesson25_3 [-n 問題数] [-c 選択肢数] [-h]

Eclipseで実行する場合

実行構成の 引数 に 「-n 12 -c 5」 を入力して実行します。

lesson25_3.java で見ておきたいポイント

このプログラムは、配列として渡された args を先頭から順番に見ていく作りになっています。

処理内容
args[i].equals("-n")次の値を問題数として受け取る
args[i].equals("-c")次の値を選択肢数として受け取る
args[i].equals("-h")help() を呼び出して使い方を表示する
それ以外想定外の引数として help() を呼ぶ

ここで注目したいのが args[++i] です。
これは、今見ているオプションの次の要素へ進み、その値を取り出しています。

たとえば、args が次の内容だったとします。

添字内容
0-n
112
2-c
35

このとき、-n を見つけたら、その次の 12 を問題数として取り出します。
そのために args[++i] が使われています。

System.exit()は何をしているのか

System.exit(int) は、プログラムをその場で終了させる命令です。
main()メソッド の中でよく使われるのは、エラー時の終了や、ヘルプ表示後の終了です。

書き方意味
System.exit(0)正常終了
System.exit(1)異常終了
0以外の値一般的にはエラー終了として扱う

たとえば、lesson25_2.java では引数の数が不足しているときに System.exit(1) を使っています。
これは「使い方が正しくなかったので、通常の処理は続けません」という意味です。

一方で、help表示だけして終了する場合は、正常に説明を出し終えたという考え方で System.exit(0) を使うこともあります。

ヘルプ機能は補助メソッドに分けると見やすい

main()メソッド の中にすべての処理を書き込むこともできますが、ヘルプ表示のような補助処理は別メソッドに分けると見通しがよくなります。

ファイル名:lesson25_4.java

public class lesson25_4 {
    public static void main(String[] args) {
        if (args.length > 0 && args[0].equals("-h")) {
            showHelp();
        } else {
            System.out.println("通常の処理を実行します。");
        }
    }

    static void showHelp() {
        System.out.println("使い方: java lesson25_4 [-h]");
        System.exit(0);
    }
}

コマンドで実行する場合

java lesson25_4 -h

実行結果

使い方: java lesson25_4 [-h]

Eclipseで実行する場合

実行構成の 引数 に -h を入力して実行します。

showHelp() を分けるメリット

メリット内容
main() が読みやすくなる入口の処理がすっきりする
再利用しやすい同じヘルプ処理を複数箇所から呼べる
役割がはっきりする何をするメソッドか分かりやすい

main()メソッド はプログラムの入口なので、できるだけ「全体の流れ」が見える形にしておくと読みやすくなります。
そのため、細かい補助的な仕事は static メソッドへ分けるのがよくある書き方です。

図:main()メソッドと引数処理の流れ

↓クリックすると拡大表示されます。

この図が示していること

main()メソッド が、実行時に渡された引数を受け取り、その内容に応じて通常処理やヘルプ表示へ分岐する流れを示しています。

この図から分かること

main()メソッド はただ処理を始めるだけでなく、引数の内容をもとに動作を切り替える司令塔のような役割を持っていることが分かります。

main()メソッド関連の要点を整理しておこう

ここで、main()メソッド に関する重要事項を整理しておきます。

項目説明
mainの書式public static void main(String[] args)
開始地点Javaアプリケーションのエントリーポイント
引数の受け取りargs[0], args[1] などで取得する
引数の個数args.length で確認する
文字列から数値への変換Integer.parseInt(...) を使う
終了処理System.exit(0), System.exit(1) などを使う
ヘルプ表示static な補助メソッドへ分けると見やすい

さらに、コマンドライン引数の例も見ておくと理解が安定します。

コマンドラインargs の内容
java Hello引数なし。長さは 0
java Hello Tokyoargs[0] = Tokyo
java lesson25_2 10 4args[0] = 10, args[1] = 4
java lesson25_3 -n 12 -c 5args[0] = -n, args[1] = 12, args[2] = -c, args[3] = 5

学習するときに意識したいポイント

main()メソッド を学ぶときは、構文の暗記だけで終わらせないことが大切です。
特に意識しておきたいのは、次の3点です。

1つ目は、main()は入口であること

Javaプログラムは、どこから始まるのかを明確にする必要があります。
その入口が main()メソッド です。
まずはここをしっかり押さえると、プログラム全体の見通しがよくなります。

2つ目は、args は文字列配列であること

数値を渡しても、最初は文字列として受け取ります。
そのため、計算や件数指定に使うには、必要に応じて型変換を行います。

3つ目は、main()に処理を詰め込みすぎないこと

小さなサンプルでは main() の中に全部書いても動きますが、機能が増えると読みにくくなります。
help() や showHelp() のように補助メソッドへ分けると、役割が整理されて読みやすくなります。

実践に向けて見えてくること

main()メソッド を理解すると、Javaプログラムの入口、引数による動作変更、エラー時の終了、ヘルプ表示といった「アプリケーションらしい動き」が少しずつ見えるようになります。
これは、単に文法を覚えるだけではなく、「使えるプログラム」を作るための土台になります。

lesson25_1.java では、main()メソッド の最小形を確認できました。
lesson25_2.java では、引数を受け取って計算する方法が見えました。
lesson25_3.java では、オプション形式で柔軟に設定を受け取る方法が分かりました。
lesson25_4.java では、補助メソッドとヘルプ表示の組み合わせが確認できました。

この流れを押さえておくと、今後はファイル名や件数、モード切り替えなどを引数で受け取るプログラムも自然に書けるようになっていきます。
main()メソッド は最初に出会う基本構文のひとつですが、実はJavaプログラム全体の設計感覚にもつながる、とても大事な入口です。