2013-01-22 7 views
0

je suis en train de copier un objet avec un constructeur de copie, mais il génère une erreur:Java - constructeur de copie - java.lang.NullPointerException

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) 

Ceci est mon constructeur de copie:

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]; 
} 

Et voilà comment j'instancier l'objet:

Polynomial pol = new Polynomial(this); 

Que dois-je faire?

Merci.

+3

Publiez votre classe 'Polynomial', pas seulement le constructeur. Nous avons besoin de savoir, ce qui est 'a'? –

+1

Vérifiez la longueur de 'poly.a' et' poly.b' et ne l'utilisez pas aveuglément dans ces lignes 'a [i] = poly.a [i];' et 'b [i] = poly.b [i]; – Srinivas

+0

Pourquoi dois-je les vérifier? Ils sont censés être exactement les mêmes. – shohamh

Répondre

1

Vous utiliseriez System.arraycopy pour créer une copie de votre tableau.

De plus, changer votre copie-constructeur à: -

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]; */ 
} 

Votre boucle for devrait fonctionner jusqu'à ce que la longueur de poly.a et poly.b et non a et b, parce qu'ils ne sont pas encore initialisées, et par conséquent NPE.

+0

Oui, c'est ce que j'ai fait, je vais le cocher dans 5 minutes quand ça va me laisser. – shohamh

+0

@shohamh .. Bien sûr. :) –

0

En supposant que votre classe Polynomial ressemble à ceci:

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); 
    } 

} 

le problème est que les variables d'instance a et b ne sont pas initialisé dans le constructeur de copie. Chaque constructeur est indépendant, et si vous voulez effectuer des actions de l'un dans l'autre, vous devez le faire explicitement en appelant une fonction d'initialisation commune, par ex.

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); 
    } 

} 
0

Vous pouvez simplement utiliser:

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

qui va créer et copier les tableaux en une seule étape chacun.

Questions connexes