2012-09-10 28 views
8

私は少し混乱しています。私は小さなコードスニペットを書いた。main()メソッドのjava args配列混乱(nullチェック)

import java.util.*; 
class AA 
{ 
    public static void main(String args[]) 
    { 
    if(args == null) 
    { 
      System.out.println("I am null"); 
    } 
    else{ 
      System.out.println(args); 
     } 
} 
} 

これは簡単なテストです。私は引数としてコマンドライン から何も渡していませんが、引き続きargsはnullではありません。これは、JVMが にString配列のようなものを初期化することを意味します。なぜこれの背後にある特定の理由?私は興味があります 知っています。任意のポインタが役立つだろう。 おかげで、 ベン

+0

[nullでないことが保証されているArg?](http://stackoverflow.com/questions/9605532/args-guaranteed-to-be-non-null)、http://プログラマ。 stackexchange.com/questions/120355/is-it-better-to-return-null-or-empty-values-from-functions-method s-where-the-ret –

答えて

6

あなたは何を渡さない、argsnullではありません - それはです:

if(args.length == 0) 
{ 
     System.out.println("I am empty"); 
} else{ 
     System.out.println(args); 
} 
+2

この動作は言語仕様のどこに記載されていますか?参考資料はありますか? – kosa

+0

argsは配列であり、コマンドラインの引数を表し、配列がnullにならないように(プログラムの初期化時には)JVMによって初期化されます。 – aleroot

+1

@ Nambari私はそれを探していましたが、 12.1節では、「初期クラスがJava仮想マシンに指定される方法はこの仕様の範囲を超えていますが、ホスト環境では一般的です。コマンドラインを使用します。クラスの完全修飾名はコマンドライン引数として指定し、その後のコマンドライン引数はメソッドmainへの引数として提供する文字列として使用します。詳細。だから私は 'ヌル'チェックを追加することは良いアイデアかもしれないと思う。 – dasblinkenlight

0

JVMが文字列としてすべての引数を作成し、合格[]という名前の「引数"これは(他の理由の中でも)行われているので、argsオブジェクトでnullをチェックする必要はありません。それは小さなことですが、それは少しの時間を節約します。

+0

これは非常に役に立ちます。私は得て、好奇心は解決した。ありがとう、トン。 – benz

1

mainメソッドの引数は、コマンドラインから渡される文字列パラメータで構成されます。何も渡されない場合、それはまだnullではありませんが、0のサイズがジャスト試みる必要があります:あなたは例外がスローされることがわかります

public static void main(String[] args) { 
    System.out.println(args[0]); 
} 

 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
4

それはセマンティックです。引数がない場合、引数のリストが空であることを意味し、引数の概念が存在しないことを意味しません。従って、argsリストは、ヌルの代わりに空の配列(すなわち、引数なし)である(すなわち、引数は存在しない)。

+0

ありがとう、トンprivat。私は理解した。それは本当に役に立つ説明でした。 – benz

0

args文字列配列のサイズをチェックします。ゼロより大きければ何もありません。また、サイズが1より大きい場合は、何かがある場合はブレークポイントを設定してください(IDEを使用している場合)配列の内容を確認するには、配列全体を反復処理します。

1

Javaプログラムの関数に渡されたargs配列がJVM自体によって初期化されていないため、配列がnullにならない場合はnull配列のチェックは間違っていません。空でもnullでなくてもかまいません。 JVMは、args配列が初期化されることを保証します。ヌルのチェックはまだ間違っていませんが、それは冗長であり、あまり意味がありません。特に、あなたが与えた感覚はありません(引数はコマンドラインで渡されません)。

配列は常に初期化されますので、あなたがnullでないことだけは空のチェックを実行することを確認することができ:

if(argsl.length == 0) { 
//Is empty 
} 

そして、あなたも直接にNullPointerExceptionを気にせずに配列を反復処理することができた:

for(String arg : args) { 
    System.out.println(arg); 
} 
+0

これはもっと論理的な説明でした。 – benz

+0

"JVMは、args配列が初期化されることを保証します。私たちは実際に公式の文書を探しています。 – kosa

+0

@ NambariあなたはJAvaプログラムのヌルの主な機能のargs配列パラメータを見たことがありますか?私はそうではありません... – aleroot