2

私のコードは

public class Test {
    public class Struct {
        public int id;
    }
    Struct s[] = new Struct[10];
    public Test() {
        s[0].id = 0;
    }
    public static void main(String[] args) {
        Test t = new Test();
    }
}

行 s[0].id = 0; でエラーが発生します。ただし、 s は初期化されているため、エラーが発生する理由がわかりません。

4

4 に答える 4

8

を初期化しましsたが、初期化する必要もありますs[0]

    s[0] = new Struct();
    s[0].id = 0;

配列が作成されると、そのすべての要素が要素タイプのデフォルト値に設定されます。参照型 (ここのようなもの) の場合、デフォルト値はnullであるため、s[0]何かnullが割り当てられるまでそのままです。

もちろん、この規則の例外は、多次元配列の作成時ですnew type[N][M]。中間の N 個の長さ M の配列を作成すると、それらの内容も要素型のデフォルト値に設定されます。

于 2013-07-14T20:26:52.810 に答える
3

新しい配列オブジェクトを作成して初期化していますが、デフォルトでは null であるため、その配列オブジェクトには独自のオブジェクトも初期化する必要があります。

s[0] = new Struct();
s[0].id = 0;

あなたの問題を解決します。

于 2013-07-14T20:27:06.157 に答える
1

配列を初期化しましたが、配列内にある参照は初期化していないため、使用する前にそれらを初期化する必要があります。

s[0] = new Struct();

s[0] s が指すものは何もありません。最初にそれが参照する Thing(Object) を与える必要があります。したがって、配列内の参照を使用するには、配列全体を初期化する必要があります。

for(i=0;i<=9;i++){
s[i] = new Struct();
}
于 2013-07-14T20:27:32.220 に答える
0

それがどのように機能するか見てみましょう。

main メソッド内で Test オブジェクトを作成しているときに、何が起こるか見てみましょう。

あなたは Test() コンストラクターが呼び出され、その中であなたがやっています

"s[0].id = 0"

しかし、ちょっと待って.. Struct 配列 s[] にまだ null があるのではありませんか?

PS: オブジェクト配列を作成するときは、null 値で初期化されることに注意してください。int 配列 int[] を作成するときと同様に、配列のすべての要素はデフォルト値 (つまりゼロ) で初期化されます。同様に、object[] を作成すると、すべての要素がデフォルトで null 値で初期化されます。

基本的に、null である s[0] の id プロパティを設定しているため、JRE によって NullPointerException がスローされます

于 2013-07-14T20:48:19.813 に答える