0
String a[]=null;
    if(a[0]!=null)
    {
        System.err.println("dd-1");
    }

    if(a!=null)
        {
        System.err.println("dd-2");
        }
    }

最初のif条件ではnullポインタ例外がスローされますが、2番目のif条件ではnullポインタ例外がスローされませんか? 誰か私に同じことを説明してもらえますか? ヒープメモリの割り当てに関するこの背後にある概念はありますか?

また、 Missing memory allocation,String a[]=new String.[10]; のせいで問題を知りました。コンセプトを説明してください。

4

5 に答える 5

2

最初の if 条件では、割り当てが行われていないにもかかわらず、配列の最初の要素にアクセスしようとしています。

2 番目の条件では、参照をテストしているだけです。

(C ポインターと考えてください。char *str = NULL は、NULL を指すポインター以外のものを割り当てません)

String a[]=null;

配列のみの参照が作成されるため、メモリは割り当てられません。

String a[] = new String[1]

1 つの String オブジェクトを保持するためのメモリがヒープ上に作成されa、割り当てられた文字列オブジェクトをポイントします。

于 2012-04-27T04:01:12.907 に答える
1
 if(a[0]!=null)

最初の条件は、配列の最初の要素にアクセスしようとしています (そして、それが存在するかどうかを確認します)。配列が存在しない場合 (つまり、null の場合) は機能しません。

 if(a!=null)

2 番目の条件は、配列自体が null かどうかを確認するだけです。

配列を作成すると、配列のメモリが(ヒープ上に)割り当てられます。その際、そのサイズも指定する必要があります (これにより、割り当てられるメモリの量が正確に決まります)。メモリも null で初期化されるため、新しい配列のガベージ データは取得されません。

配列要素へのアクセスは、C のようなポインター演算だけではありません。Java は、配列が存在するかどうか、およびインデックスがその範囲内にあるかどうかを実際にチェックします。

于 2012-04-27T03:58:49.590 に答える
0

Java では、配列は C とは異なり、ヒープに存在するオブジェクトであり、要素にアクセスするための特別な型と構文がありますが、オブジェクトです。サブインデックスにアクセスする場合は、次のようにする必要があります。

String[] a = new String[10];

その後、各要素は配列の型に応じて null、0、または false で初期化されます。

于 2012-04-27T03:58:17.990 に答える
0

配列はオブジェクトです。それらのための新しいスペースを作成する必要があります。null 参照にアクセスしようとすると、NullPointerException毎回取得されます。

于 2012-04-27T03:59:43.220 に答える
0

を使用するa[0]と、オブジェクト (配列の最初のオブジェクト) にアクセスします。しかし、aまだオブジェクトがありません。したがって、最初のものは例外をスローします。しかし、2番目のものでは、参照をチェックしています。それはオブジェクトではありません。NULLaに等しいです。

于 2012-04-27T04:02:20.410 に答える