Исключение NullPointer в Java - PullRequest
       4

Исключение NullPointer в Java

0 голосов
/ 12 октября 2010

Я пытаюсь вычислить Z_Scores в Java. Тем не менее, я новичок в программировании и Java и не могу понять, что не так. Я продолжаю получать исключение нулевого указателя. Может ли кто-нибудь просветить меня о том, что я делаю неправильно. Я получаю исключение в строке 80 жирным шрифтом. По какой-то причине ему не нравится объект, который я использую. Вот мой исходный код:

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

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 12 октября 2010
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
2 голосов
/ 12 октября 2010

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

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

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

Z_score r = new Z_score();

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...