サーチ…


構文

  • public static void main(String [] args)

パラメーター

パラメータ詳細
args コマンドライン引数。 mainメソッドがJavaランチャーによって呼び出されると仮定すると、 argsはnullでなく、 null要素もありません。

備考

通常のJavaアプリケーションをjavaコマンド(または同等のもの)を使用して起動すると、 args配列のコマンドラインから引数を渡してmainメソッドが呼び出されます。

残念なことに、Java SEクラスライブラリは、コマンド引数の処理を直接サポートしていません。これにより、2つの選択肢が残されます。

  • Javaで手作業で引数処理を実装します。
  • サードパーティのライブラリを利用する。

このトピックでは、一般的なサードパーティのライブラリの一部をカバーしようとしています。代替案の広範なリストについては、StackOverflowの質問に対する答えを参照してください。 "Javaでコマンドライン引数を解析する方法は?"

GWT ToolBaseによる引数処理

オプションのパラメータなど、より複雑なコマンドライン引数を解析する場合は、GoogleのGWTアプローチを使用するよりも最適です。すべてのクラスは公開されています:

https:/ / / / /

myprogram -dir "~/Documents" -port 8888のコマンドライン・myprogram -dir "~/Documents" -port 8888を処理する例は次のとおりです。

public class MyProgramHandler extends ToolBase {
   protected File dir;
   protected int port;
   // getters for dir and port
   ...

   public MyProgramHandler() {
       this.registerHandler(new ArgHandlerDir() {
            @Override
            public void setDir(File dir) {
                this.dir = dir;
            }
       });
       this.registerHandler(new ArgHandlerInt() {
            @Override
            public String[] getTagArgs() {
               return new String[]{"port"};
            }
            @Override
            public void setInt(int value) {
               this.port = value;
            }
       });
   }
   public static void main(String[] args) {
      MyProgramHandler myShell = new MyProgramHandler();
      if (myShell.processArgs(args)) {
         // main program operation
         System.out.println(String.format("port: %d; dir: %s",
            myShell.getPort(), myShell.getDir()));
      }
      System.exit(1);
   }
}

ArgHandlerには、 isRequired()メソッドがあります。このメソッドは、コマンドライン引数が必要であると言うために上書きすることができます(デフォルトの戻り値はfalseで、引数はオプションです)。

手で議論を処理する

アプリケーションのコマンドライン構文が単純な場合は、コマンドコードの処理をすべてカスタムコードで行うのが妥当です。

この例では、一連の簡単なケーススタディを紹介します。いずれの場合も、引数が受け入れられない場合、コードはエラーメッセージを生成し、コマンドが失敗したことをシェルに伝えるためにSystem.exit(1)を呼び出します。 (いずれの場合も、Javaコードは、名前が "myapp"のラッパーを使用して呼び出されると仮定します)。

引数のないコマンド

このケーススタディでは、コマンドは引数を必要としません。このコードは、 args.lengthがコマンドライン引数の数を示していることを示しています。

public class Main {
    public static void main(String[] args) {
        if (args.length > 0) {
            System.err.println("usage: myapp");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked");
    }
}

2つの引数を持つコマンド

このケーススタディでは、コマンドは正確に2つの引数を必要とします。

public class Main {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("usage: myapp <arg1> <arg2>");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked: " + args[0] + ", " + args[1]);
    }
}

args.lengthチェックを怠ると、ユーザがコマンドライン引数をあまりにも少なすぎて実行した場合、コマンドがクラッシュすることに注意してください。

"フラグ"オプションと少なくとも1つの引数を持つコマンド

このケーススタディでは、コマンドには2つの(オプションの)フラグオプションがあり、オプションの後に少なくとも1つの引数が必要です。

package tommy;
public class Main {
    public static void main(String[] args) {
        boolean feelMe = false;
        boolean seeMe = false;
        int index;
        loop: for (index = 0; index < args.length; index++) {
            String opt = args[index];
            switch (opt) {
            case "-c":
               seeMe = true;
               break;
            case "-f":
               feelMe = true;
               break;
            default:
               if (!opts.isEmpty() && opts.charAt(0) == '-') {
                   error("Unknown option: '" + opt + "');
               }
               break loop;
            }
        }
        if (index >= args.length) {
            error("Missing argument(s)");
        }      
        
        // Run the application
        // ...
    }

    private static void error(String message) {
        if (message != null) {
            System.err.println(message);
        }
        System.err.println("usage: myapp [-f] [-c] [ <arg> ...]");
        System.exit(1);
   }
}

見て分かるように、コマンド構文が複雑な場合は、引数とオプションの処理が面倒になります。 "コマンドライン解析"ライブラリを使用することをお勧めします。他の例を参照してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow