2010-10-11 4 views
0

Я пытаюсь вычислить Z_Scores в Java. Однако я новичок в программировании и Java и не могу понять, что не так. Я получаю исключение с нулевым указателем. Может ли кто-нибудь просветить меня о том, что я делаю неправильно. Я получаю исключение на строке 80, выделенной жирным шрифтом. По какой-то причине ему не нравится объект, который я использую. Вот мой исходный код:Исключение NullPointer в 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); 
} 
} 

Заранее благодарен!

+1

что/где ваше точное исключение нулевого указателя? что поможет нам сузить его. Выход NPE должен точно указывать, в какой строке файла + класс +, где возникла проблема. –

+1

От имени всех ваших будущих коллег, пожалуйста, не используйте Z_All = z_All; или SD = sD; :) P –

+0

Не бойтесь использовать настоящие имена для своих переменных. Гораздо сложнее отлаживать, когда имена переменных являются одиночными буквами. –

ответ

2

Хорошо, у вас здесь странные вещи.

В конечном счете вам нужно позвонить setZ_All в любой экземпляр Z_score, прежде чем пытаться его распечатать. Это приведет к инициализации переменной Z_All, так что она больше не будет нулевой.

Похоже, что корень проблемы находится в методе Z_Calc (Expert_Score ... args). Этот метод является методом экземпляра Z_score, но вы инстанцировании новый Z_score на первой строке этого метода (32):

Z_score r = new Z_score(); 

Вы затем использовать эту переменную г на протяжении метода, а потому, что г является отдельный экземпляр класса Z_score, который вы делаете с ним, действительно имеет значение в контексте вашего основного метода. Поэтому, хотя setZ_All вызывается в экземпляре r, он фактически не влияет на экземпляр, созданный в строке 103 в вашем основном методе.

Короче говоря, попробуйте заменить все ссылки на «r» на «this» в вашем методе Z_Calc и посмотреть, не приведет ли это вас дальше. У меня есть чувство, что есть еще несколько ошибок, но это должно помочь с этим.

+0

Я сделал это, и это сделало вещи намного лучше. Однако, как вы подозревали, у меня все еще есть проблемы. По какой-то причине он вычисляет только последний экземпляр в моем Z_Expert [] – Spencer

+0

@Spencer, сначала немного очистите свой код, избавьтесь от символов подчеркивания, отформатируйте имена классов, такие как ClassName, переменные, такие как variableName, и используйте полные слова или даже фразы для всех имен переменных вместо букв. Затем добавьте несколько строк в ключевые моменты кода, чтобы помочь вам понять, что происходит.Если у вас все еще есть проблемы, попытайтесь изолировать проблему до одного метода, а затем задайте другой вопрос только с хорошо отформатированным кодом для этого метода и хорошим описанием того, что пошло не так. –

+0

Я испортил его и, наконец, получил его! Большое спасибо Майку! – 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

Чтобы расширить этот отличный ответ, вам не хватает конструктора для класса Z_score, что означает, что Z_score.Z_All будет пустым, пока вы не вызовете Z_score.setZ_All(). (или добавить эквивалентный конструктор) –

Смежные вопросы