3

これを Eclipse で Java アプリケーションとして実行します。驚いたことに、それは最初の行を出力します。私はそれが2番目に印刷されることを期待していました。コマンド ラインに何も入力したことがないのに、なぜこのようなことが起こるのでしょうか?

class Game
{   
    public static void main(String args[])
    {
        if(args != null){
            System.out.println("Lets do something with args");
        }else{
            System.out.println("Cant do something until args is not null"); 
        }
    }
}

編集 -

また、回答の1つに応じて別のことを試しました。メインのすべてのコードを削除し、これに置き換えます-

System.out.println("Main method..."); 
for(int i = 0; i< args.length; i++){
System.out.println("i = " + i); 
} 

出力はメインメソッドです。なんで ?

4

6 に答える 6

5

配列はargsではなく空nullです。これを行う必要があります:

if (args.length > 0) {
    System.out.println("Lets do something with args");
} else {
    System.out.println("Cant do something until args is not empty");
}

プログラムが実行される前に、次のようなことが起こります。

args = new String[0]; // create a new, empty array of strings

この後、コマンド ラインからの各引数があれば、この配列に追加されます。次に、この args 配列をパラメーターとしてメイン関数が呼び出されます。

null 配列と空の配列には違いがあります。まず、配列は単なる値のセットではありません。実際の値と長さ変数の 2 つの主なものを格納するコンテナーが必要です (そのため、毎回値をカウントする必要はありません)。このコンテナー (Java クラス) にもストレージが必要です。割り当てる必要があります。

もしあなたがそうするなら:

String[] args;

argstype の変数があるだけですString[]。割り当てられたことがないため、ストレージがありません。Java はそれを に初期化しnullます。null数字のゼロと考えてください。これは単なる慣習であり、初期化されていないことを意味します。argsクラスの引数は名前付けされている必要があるため、 (args.lengthたとえば)の何もアクセスできません。まだ存在しません。しようとすると、NullPointerException が発生します。

もしあなたがそうするなら:

String[] args = new String[0];

argstype の変数ができましたが、新しいクラスString[]でも初期化されています。String[]デフォルトでは、この配列クラスには値がなく、長さはゼロです。しかし、このクラスは存在します。メモリのどこかに格納されているこのクラスを識別する、argsゼロ (前のケースの ) とは異なる数値 (アドレス) であると考えることができます。null事実上、これを行うargs.lengthと、アドレスによって識別されるクラスにアクセスするよう Java に指示していることになりargs(通常、このアドレスはコード内またはどこにも表示されず、Java がこれを処理します)、その内部からクラスは長さ変数を取得します。同様に、args[0]最初にメモリからクラスを取得し、そこから最初の値を取得します。

于 2013-06-13T17:38:41.663 に答える
2

コマンドライン引数をプログラムに渡さない場合、argsnull長さ 0 ではなく長さ 0 になりString[]ます。印刷してみてくださいargs.length-null値は例外をスローしますが、長さ 0 の配列は印刷します0

于 2013-06-13T17:36:43.010 に答える
0

コマンドライン文字列配列はnull空ではありません。要素は含まれていません。

あなたの編集では、出力はmain methodループが1回も繰り返されないためです。これは、配列の要素がゼロであるため、一度もループに入らないためです。

于 2013-06-13T17:37:36.083 に答える