Java:コマンドライン引数がnullかどうかを確認します


89

コマンドライン引数のエラーチェックを行いたい

public static void main(String[] args)
{
    if(args[0] == null)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

ただし、これは範囲外の配列の例外を返すため、理にかなっています。適切な使用法を探しています。

回答:


159

引数は決してできませんnull。それらは存在しません。

つまり、引数の長さを確認する必要があります。

public static void main(String[] args)
{
    // Check how many arguments were passed in
    if(args.length == 0)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

18

@jjnguyの答えはほとんどの状況で正しいです。アプリケーションを通常の方法でコマンドラインから実行することによって呼び出された場合null、引数の配列(またはnull配列)に文字列は表示されませんmain

ただし、アプリケーションの他の部分がmainメソッドを呼び出す場合、null引数またはnull引数配列を渡す可能性があります。

ただし、(2)、これは明らかに非常に異常なユースケースでありmainエントリポイントメソッドの暗黙の契約に対する重大な違反です。したがって、でnull引数の値をチェックする必要はないと思いますmain。それらが発生するというまれなイベントでは、呼び出しコードがを取得することは許容されNullPointerExceptionます。結局のところ、契約に違反するのは発信者のバグです。


11

この点をさらに詳しく説明します。

args変数自体がnullになる可能性がありますが、通常の実行ではできません。通常の実行ではjava.exe、コマンドラインからのエントリポイントとして使用されます。ただし、C++JNIでコンパイルされたコードを使用してを使用jvm.dllし、java.exeを完全にバイパスするプログラムをいくつか見ました。この場合、NULLmainメソッドに渡すことができます。その場合、argsはnullになります。

常にif ((args == null) || (args.length == 0))、またはif ((args != null) && (args.length > 0))必要に応じて確認することをお勧めします。


0

を確認する必要があり(args == null || args.length == 0)ます。が、nullチェックは本当に必要されていない、それは良い習慣です。


1
不要なチェックはお勧めできません。nullチェックは不要ですが、あなたはそれを正しいとlength、チェックが必要である
スティーブン・C

-10

引数を渡さない場合、その場合でもargsは初期化されますが、アイテム/要素はありません。次のいずれかを試してください、同じ効果が得られます:

 
public static void main(String[] args) throws InterruptedException {
        String [] dummy= new String [] {};
        if(dummy[0] == null)
        {
            System.out.println("Proper Usage is: java program filename");
            System.exit(0);
        }

    }


1
これは完全に間違っています。アプリケーションがコマンドライン引数なしで起動された場合、mainメソッドはargs長さがゼロの配列で呼び出されます。
スティーブンC

@Stephen内部に要素がない配列の長さはゼロです。次に、私の答えの何が問題になっていますか?
Puspendu Banerjee 2010

@Puspendu-何が問題なのはdummy[0]、配列のインデックスが範囲外の例外をスローすることです!! プログラムを(戻る)テストに変更し、args[0]引数なしで実行した場合も同様です。
スティーブンC

1
はい、分かりました。あなたがあなたの最初の文を打ち間違えていなかったら、それは助けになったでしょう。書かれているように、それは理解できません。私はあなたが最後のコメントでそれを静かに修正したことに注意します。卑劣。
スティーブンC

1
「私は問題を説明しようとしたのではなく、解決策を示していません」。次に、回答を投稿しないでください。コメントを投稿。
Stealth Rabbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.