2010-10-11 5 views
0

J'essaie de calculer Z_Scores en Java. Cependant, je suis nouveau à la programmation et Java et ne peux pas sembler comprendre ce qui ne va pas. Je continue d'obtenir une exception de pointeur nul. Quelqu'un peut-il m'éclairer sur ce que je fais de mal? Je reçois l'exception à la ligne 80 en gras. Pour une raison quelconque, il n'aime pas l'objet que j'utilise. Voici mon code source:Exception NullPointer en Java

public class Z_score { 
    double Mean []=new double[10]; 
    double SD []=new double[10]; 
    Z_Expert [] Z_All; 

    public Z_Expert[] getZ_All() { 
     return Z_All; 
    } 

    public void setZ_All(Z_Expert[] z_All) { 
     Z_All = z_All; 
    } 

    public double[] getMean() { 
     return Mean; 
    } 

    public double[] getSD() { 
     return SD; 
    } 

    public void setSD(double[] sD) { 
     SD = sD; 
    } 

    public void setMean(double[] mean) { 
     Mean = mean; 
    } 


    public void Z_Calc(Expert_Score...args){ 
     Z_score r = new Z_score(); 
     Expert_Score[] All_users=args; 
     double sum = 0; 
     double v = 0; 
     double t []= new double[10]; 
     double h []= new double[10]; 
     double a []= new double[10]; 
     double [] w=new double[10]; 
     double [] s=new double[10]; 
     Z_Expert[] All_user = new Z_Expert[All_users.length]; 
     for(int j=0;j<10;j++){ 
      for(int i=0;i<All_users.length;i++){ 
       Expert_Score x=All_users[i]; 
       double [] y=x.getExpert_Scores(); 
       sum=sum+y[j]; 
      } 
      t[j]=(sum/All_users.length); 
      sum=sum-t[j]*All_users.length; 
     } 
     r.setMean(t); 
     for (int k=0;k<10 ;k++){ 
      for(int l=0;l<All_users.length;l++){ 
       Expert_Score z=All_users[l]; 
       double [] q=z.getExpert_Scores(); 
       v=v+(q[k]-t[k])*(q[k]-t[k]); 
      } 
      a[k]=(v/All_users.length); 
      v=v-a[k]*All_users.length; 
     } 
     r.setSD(a); 
     s=r.getMean(); 
     w=r.getSD(); 
     for (int m=0;m<10;m++){ 
      for(int n=0;n<All_users.length;n++){ 
       Expert_Score z=All_users[n]; 
       int a2=z.getID(); 
       double [] q=z.getExpert_Scores(); 
       h[m]=(q[m]-s[m])/w[m]; 
       Z_Expert a1 = new Z_Expert(a2, h); 
       All_user[n]=a1; 
      } 
      r.setZ_All(All_user); 
     } 

    } 

    public void print(Z_score x) { 
     Z_Expert [] g=x.getZ_All(); 
     **for(int p=0;p<g.length;p++){** 
     Z_Expert e=g[p]; 
     int sum=1; 
     double [] f=e.getExpert_Scores(); 
     System.out.println("ID: "+e.getID()); 
      for(int o = 0;o<10;o++){ 
       System.out.print("Domain "+sum+": "+f[o]+ " "); 
       sum++; 
      } 
     System.out.println(); 
     System.out.println(); 

     } 
    } 


public static void main(String[] args){ 
     double p1[] = {1,2,5,7,5,6,6,8,9,10}; 
     double p2[] = {4,3,4,3,4,1,2,3,1,5}; 
     double p3[] = {10,2,6,4,5,6,7,8,9,10}; 
     Expert_Score x = new Expert_Score(1, p1); 
     Expert_Score y = new Expert_Score(2, p2); 
     Expert_Score z = new Expert_Score(3, p3); 
     Z_score scrCalc = new Z_score(); 
     scrCalc.Z_Calc(x,y,z); 
     scrCalc.print(scrCalc); 
} 
} 

Merci d'avance!

+1

quoi/où est votre exception exacte de pointeur nul? Cela nous aiderait à le réduire. La sortie NPE doit indiquer exactement quel fichier + classe + ligne exactement où le problème s'est produit. –

+1

Au nom de tous vos futurs collègues, n'utilisez pas Z_All = z_All; ou SD = sD; :) P –

+0

N'ayez pas peur d'utiliser de vrais noms pour vos variables. Il est beaucoup plus difficile de déboguer lorsque vos noms de variables sont des lettres simples. –

Répondre

2

Ok, vous avez des choses étranges qui se passent ici.

Finalement, vous devez appeler setZ_All sur une instance de Z_score avant d'essayer de l'imprimer. Cela va initialiser la variable Z_All de telle sorte qu'elle ne sera plus nulle.

Il me semble que la racine du problème est dans la méthode Z_Calc (Expert_Score ... args). Cette méthode est une méthode d'instance de Z_score, mais vous instancier une nouvelle Z_score sur la première ligne de cette méthode (32):

Z_score r = new Z_score(); 

Vous utilisez cette variable r tout au long de la méthode, mais parce que r est un instance distincte de la classe Z_score, rien de ce que vous faites n'a d'importance dans le contexte de votre méthode principale. Ainsi, même si setZ_All est appelé sur l'instance r, il n'affecte pas réellement l'instance créée à la ligne 103 de votre méthode principale. En bref, essayez de remplacer toutes les références à 'r' par 'this' dans votre méthode Z_Calc et voyez si cela vous va plus loin. J'ai le sentiment qu'il y a encore plus d'erreurs, mais cela devrait aider avec celui-ci.

+0

Je l'ai fait et cela a rendu les choses beaucoup mieux. Cependant, comme vous l'avez soupçonné, j'ai encore des problèmes. Pour une raison quelconque, il calcule uniquement pour la dernière instance dans mon Z_Expert [] – Spencer

+0

@Spencer, nettoyez d'abord votre code, éliminez les caractères de soulignement, formatez les noms de classe comme ClassName, les variables comme variableName et utilisez des mots entiers ou même phrases pour tous vos noms de variables au lieu de seulement des lettres. Ajoutez ensuite des printlns aux points clés du code pour vous aider à voir ce qui se passe.Si vous avez encore des problèmes, essayez d'isoler le problème à une méthode, puis posez une autre question avec seulement le code bien formaté pour cette méthode et une bonne description de ce qui s'est mal passé. –

+0

Je me suis amusé avec ça et je l'ai enfin réussi! Merci beaucoup Mike! – Spencer

3
Z_Expert [] g=x.getZ_All();    // returns null and assigns null to g 
**for(int p=0;p<g.length;p++){**   // references g.length, but g is null 
+0

Pour étendre cette excellente réponse, il vous manque un constructeur pour la classe Z_score, ce qui signifie que Z_score.Z_All sera nulle jusqu'à ce que vous appeliez Z_score.setZ_All(). (ou ajouter un constructeur équivalent) –