-3

オブジェクトの配列を複製したいが、配列にいくつかの null 要素がある場合、clone() メソッドを実装するにはどうすればよいですか? 例えば:

class A {};

class B implements Cloneable {
    A[] arrayFoo = new A[maxNumber];
    // let some elements in arrayFoo be null
    // now I want to implement a clone method
    public B clone() throws CloneNotSupportedException {
        B result = (B) super.clone()
        return result;
    }
}

これにより、null ポインター例外がスローされます。このバグを修正するには?

4

2 に答える 2

1

これを試してください(NullPointerExceptionはスローされません):

class A {};


class B implements Cloneable {
    public static final int MAX_NUMBER = 42;
    A[] arrayFoo = new A[MAX_NUMBER];
    // let some elements in arrayFoo be null
    // now I want to implement a clone method
    public B clone() throws CloneNotSupportedException {
        B result = (B) super.clone();
        return result;
    }



    public static void main(String[] args) throws CloneNotSupportedException {
        B b1 = new B();
        B b2 = b1.clone();

        System.out.println("Done!");
    }
}

結論: このような質問を投稿するときは、 NullPointerExceptionが発生したコード行を常に正確に指定し、その特定の行が質問に投稿されていることを常に確認してください


私の推測 (C++ のバックグラウンドの場合) は、次のように宣言されているメンバー変数で clone を呼び出していることです。

B b;

これは NullPointerException をスローしますが、clone実装が原因ではありません。B b;Java では何もインスタンス化されません。Bオブジェクトを指すことができる参照を宣言するだけです。ただし、参照は として初期化されnullます。したがって、クローンをb呼び出すことは、存在しないオブジェクトに対してクローンを呼び出そうとすることになります。

于 2013-03-05T08:13:22.173 に答える
0

配列のクローンを作成すると浅いコピーが実行され、null 値が適切にコピーされます。配列変数自体が null でない限り、NullPointerException は生成されません。

于 2013-03-05T08:35:27.353 に答える