コマンドライン引数

今まで,main メソッドの引数に String型の配列がついていました. この変数を使うと,コマンドライン引数で受け取った値をプログラムから利用できます.

つまり,ターミナル上でプログラムを実行するとき,後ろに指定した文字列をプログラムで受け取れます.

$ java HogeHoge command line arguments
    # => 上記の command, line, arguments がコマンドライン引数

例題1 ArgsPrinter

次のプログラムで,コマンドライン引数で与えられた値を全て出力してみましょう.

public class ArgsPrinter{
    void run(String[] args){
        // args のインデックスの0番目から最後までを繰り返して,
        // args の各要素を出力してみましょう.
        for(...) {
            // 何番目の要素として,何が配列の要素として格納されているかを確認しましょう.
            System.out.printf("%d: %s%n", ...);
        }
    }
    public static void main(String[] args){
        ArgsPrinter printer = new ArgsPrinter();
        printer.run(args);
    }
}

実行例

入力できれば,上記のプログラムを実行して実行結果を確認してください. 実行する時,コマンドライン引数をいくつか与えてみてください.

$ java ArgsPrinter
$ java ArgsPrinter abc def ghi
$ java ArgsPrinter abcdefg
$ java ArgsPrinter 0 1 2 3 4 5 6 7 8 9

このように,run メソッドが引数を受け取るようにすることもできます. 必要に応じてコマンドライン引数を run メソッドでアクセスできるようにしましょう.

例題1の解答例

例題2 コマンドライン引数とデフォルト値

コマンドライン引数に何か値が与えられた場合はその値を出力し,そうでない場合は"no arguments"を出力しましょう.

public class FindValueInArgs {
    void run(String[] args) {
        String value = // デフォルト値を代入しておく.
        // もしコマンドライン引数に値が存在すれば
        if(...) {
            // コマンドライン引数で与えられた値を value に代入する.
        }
        System.out.printf("args[0]: %s%n", value); 
    }

    public static void main(String[] args) {
        FindValueInArgs app = new FindValueInArgs();
        app.run(args);
    }
}

デフォルト値を args[0] = "no arguments" とできない点に注意してください. 配列は長さを変更できません. つまり,コマンドライン引数が与えられなかった場合,args の長さは 0 ですので,args[0] は範囲を超えたアクセスになります. そのため,別の変数(value)を用意し,そこにデフォルト値もしくは,指定された値を代入しましょう.

実行例

入力できれば,上記のプログラムを実行して実行結果を確認してください. 実行する時,コマンドライン引数をいくつか与えてみてください.

$ java FindValueInArgs
$ java FindValueInArgs hello
$ java FindValueInArgs world
$ java FindValueInArgs hello world

このようにすることで,コマンドライン引数で指定された場合はその値を利用し, そうでない場合はデフォルト値を利用することが可能になります.

例題2の解答例