コマンドライン引数

mainメソッドは、プログラムの起動時に自動的に呼び出される特別なメソッドです。 だとすると、その仮引数argsには一体何が入っているのでしょうか。 それでは、気になるmainメソッドの仮引数について学習しましょう。

コマンドライン引数を表示してみる

これまでは、プログラムを実行するために次のような形でコマンドを入力してきました。

java <クラス名>

実は、プログラムを実行するときに、何らかのデータを指定することができるのです。 それには次のような形でコマンドを入力します。

javac <クラス名> <引数1> <引数2> ...

この<引数1> <引数2> ...によって与えられる引数をコマンドライン引数と呼びます。 <ソースファイル名>と<引数1>の間、各引数の間は半角のスペースで区切ります。 プログラム中では、mainメソッドの仮引数argsを使って、入力されたコマンドライン引数へアクセスすることができます。 mainメソッドは、文字列を要素として持つ配列をargsに受け取ります。 そして、その文字列には入力されたコマンドライン引数が格納されているのです。

厳密に言えば、文字列への参照を要素として持つ配列への参照をargsに受け取ります。 文字列も配列も参照型に分類されます。

MethodSample18は、与えられたコマンドライン引数を順番に表示するプログラムです。

MethodSample18.java
class MethodSample18 {
    public static void main(String[] args){
        if(args.length == 0){
            System.out.println("コマンドライン引数が有りません。");
        }else{
            for(int i = 0; i < args.length; i++){
                System.out.println((i + 1) + "番目 : " + args[i]);
            }
        }
    }
}

次のように、コマンドライン引数を与えてMethodSample18を実行してみましょう。

java MethodSample18 iMac iPod iPhone iPad

実行結果は次のようになります。

図 9-16 : MethodSample18の実行結果 1

ここでは、コマンドライン引数を4つ指定しているので、args.lengthの値が4となり、if〜else文ではelse以降のfor文が実行されて、コマンドライン引数として指定された4つの文字列が次々に表示されます。 配列argsの様子を詳しく表したものが図 9-17です。

配列argsの要素は文字列そのものではなく、文字列への参照です。

図 9-17 : mainメソッドの引数

今度は、コマンドライン引数を指定せずにMethodSample18を実行してみましょう。

java MethodSample18

実行結果は次のようになります。

図 9-18 : MethodSample18の実行結果 2

今回はargs.lengthの値が0なので、if〜else文では System.out.println("コマンドライン引数が有りません。"); の方が実行されます。

コマンドライン引数を一つも指定しない場合も、argsの値はnullではありません。 argsは確かに配列本体を参照しています。 ただ単にその配列本体の長さが0だというだけのことです。

mainメソッドは、コマンドライン引数をString[]型の仮引数として受け取る。

数値を表すコマンドライン引数

MethodSample18では、コマンドライン引数はあくまでも文字列として扱われました。 それでは、数値を表すコマンドライン引数を文字列ではなく、数値として扱うにはどうすればいいのでしょうか。

MethodSample19は、コマンドライン引数でいくつかの数値を指定して、それらの総和を求め、表示するプログラムです。

MethodSample19.java
class MethodSample19 {
    public static void main(String[] args){
        int s = 0;
        for(int i = 0; i < args.length; i++){
            s += Integer.parseInt(args[i]);
        }
        System.out.println("合計は" + s + "です。");
    }
}

次のように、コマンドライン引数を与えてMethodSample19を実行してみましょう。

java MethodSample19 42 15
図 9-19 : MethodSample19の実行結果 1

42, 15という数値が、確かに数値として足し算されているのが分かりいただけると思います。

ここで注目してほしいのは次の部分です。

            s += Integer.parseInt(args[i]);

これは、キーボードからの数値の入力ではお馴染みの形ですね。 Integer.parseInt(args[i]) によって、数値を表す文字列から、int型の数値を取得して、その値を変数sに加算しているのです。

では、コマンドライン引数を指定しない場合はどうなるでしょう。

java MethodSample19
図 9-20 : MethodSample19の実行結果 2

この場合は、args.lengthの値が0なので、for文のループ本体は一度も実行されず、変数sは0のまま表示されます。

コマンドライン引数を数値として扱うには、mainメソッドが受け取った配列の各要素からint型、double型などの数値型の値を取得する必要がある。