0

コピー コンストラクターを使用してオブジェクトをコピーしようとしていますが、エラーが出力されます。

Exception in thread "main" java.lang.NullPointerException
at Polynomial.<init>(Polynomial.java:30)
at Polynomial.showDerivative(Polynomial.java:59)
at Program.main(Program.java:9)

これは私のコピーコンストラクターです:

public Polynomial(Polynomial poly)
{
    for(int i = 0; i < a.length; i++)
        a[i] = poly.a[i];
    for(int i = 0; i < b.length; i++)
        b[i] = poly.b[i];
}

そして、これは私がオブジェクトをインスタンス化する方法です:

Polynomial pol = new Polynomial(this);

私は何をしますか?

ありがとう。

4

3 に答える 3

1

System.arraycopy配列のコピーを作成するために使用する方がよいでしょう。

さらに、コピー コンストラクターを次のように変更します。

public Polynomial(Polynomial poly)
{
    int aLen = poly.a.length;
    int bLen = poly.b.length;

    // Initialize arrays for this object
    a = new int[aLen];  // Assuming `a` and `b` are integer arrays
    b = new int[bLen];  // Change accordingly.

    // A better way to create copy of arrays would be to use `System.arraycopy
    System.arraycopy( poly.a, 0, a, 0, aLen);
    System.arraycopy( poly.b, 0, b, 0, bLen);


    /*** You can avoid using below loops ***/

    // Iterate till the `aLen` of `poly` object passed 
    // and add elements to `a` array of this object
    /*for(int i = 0; i < aLen; i++)
        a[i] = poly.a[i];

    // Iterate till the `bLen` of `poly` object passed 
    // and add elements to `b` array of this object
    for(int i = 0; i < bLen; i++)
        b[i] = poly.b[i]; */
}

ループはandとnotforの長さまで実行する必要があります。これらはまだ初期化されていないためです。poly.apoly.babNPE

于 2013-01-22T19:00:52.793 に答える
0

あなたはただ使うことができます:

public Polynomial(Polynomial poly) {
    a=poly.a.clone(); 
    b=poly.b.clone();
    }

これにより、アレイがそれぞれ 1 ステップで作成およびコピーされます。

于 2013-01-22T19:07:32.623 に答える
0

Polynomialクラスが次のようになっていると仮定します。

public class Polynomial {

    private int[] a;
    private int[] b;

    public Polynomial(int length) {
        a = new int[length];
        b = new int[length];
    }

    public Polynomial(Polynomial poly)
    {
        for(int i = 0; i < a.length; i++)
            a[i] = poly.a[i];
        for(int i = 0; i < b.length; i++)
            b[i] = poly.b[i];
    }


    public static void main(String[] args) {
        Polynomial p = new Polynomial(2);
        Polynomial q = new Polynomial(p);
    }

}

問題は、インスタンス変数abがコピー コンストラクターで初期化されていないことです。各コンストラクターは独立しており、あるアクションから別のアクションを実行したい場合は、共通の初期化関数を呼び出して明示的に実行する必要があります。

public class Polynomial {

    private int[] a;
    private int[] b;

    private void init(int length) {
        a = new int[length];
        b = new int[length];
    }

    public Polynomial(int length) {
        init(length);
    }

    public Polynomial(Polynomial poly)
    {
        init(poly.a.length);
        for(int i = 0; i < a.length; i++)
            a[i] = poly.a[i];
        for(int i = 0; i < b.length; i++)
            b[i] = poly.b[i];
    }


    public static void main(String[] args) {
        Polynomial p = new Polynomial(2);
        Polynomial q = new Polynomial(p);
    }

}
于 2013-01-22T19:02:14.457 に答える