Java中的空指针异常

Java中的空指针异常,java,nullpointerexception,Java,Nullpointerexception,我试图用Java计算Z_分数。然而,我对编程和Java还不熟悉,似乎无法找出问题所在。我一直得到一个空指针异常。谁能告诉我我做错了什么。我在第80行用粗体显示异常。不管出于什么原因,它都不喜欢我正在使用的对象。以下是我的源代码: public class Z_score { double Mean []=new double[10]; double SD []=new double[10]; Z_Expert [] Z_All; public Z_Exp

我试图用Java计算Z_分数。然而,我对编程和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);
}
}
public class Z_分数{
双平均值[]=新双平均值[10];
双SD[]=新双[10];
Z_专家[]Z_所有人;
公共Z_专家[]getZ_All(){
返回Z_All;
}
公共无效集合集合(集合专家[]集合集合集合){
Z_All=Z_All;
}
公共双[]getMean(){
回归均值;
}
公共双[]getSD(){
返回SD;
}
公共无效设置D(双[]sD){
SD=SD;
}
公共无效设定平均值(双[]平均值){
平均值=平均值;
}
公共无效Z_计算(专家评分…参数){
Z_分数r=新的Z_分数();
专家评分[]所有用户=args;
双和=0;
双v=0;
双t[]=新双[10];
双h[]=新双[10];
双a[]=新双[10];
double[]w=新的double[10];
double[]s=新的double[10];
Z_Expert[]All_user=新的Z_Expert[All_users.length];
for(int j=0;j
Z_Expert[]g=x.getZ_All();//返回null并将null赋值给g
**for(int p=0;p
Z_Expert[]g=x.getZ_All();//返回null并将null赋值给g

**对于(int p=0;p好的,这里发生了一些奇怪的事情

最终,在打印之前,您需要在Z_score的任何实例上调用setZ_All。这将初始化Z_All变量,使其不再为null

在我看来,问题的根源在于Z_Calc(Expert_Score…args)方法。该方法是Z_Score的实例方法,但您正在该方法(32)的第一行实例化一个新的Z_分数:

然后在整个方法中使用这个r变量,但因为r是Z_score类的一个单独实例,所以在主方法的上下文中,对它所做的任何事情都不重要。因此,即使在r实例上调用setZ_All,它实际上并不影响在主方法的第103行创建的实例


长话短说,试着在Z_Calc方法中用“this”替换所有对“r”的引用,看看这是否能让你走得更远。我感觉还有一些错误,但这应该会对这一点有所帮助。

好的,这里发生了一些奇怪的事情

最终,在打印之前,您需要在Z_score的任何实例上调用setZ_All。这将初始化Z_All变量,使其不再为null

在我看来,问题的根源在于Z_Calc(Expert_Score…args)方法。该方法是Z_Score的实例方法,但您正在该方法(32)的第一行实例化一个新的Z_分数:

然后在整个方法中使用这个r变量,但因为r是Z_score类的一个单独实例,所以在主方法的上下文中,对它所做的任何事情都不重要。因此,即使在r实例上调用setZ_All,它实际上并不影响在主方法的第103行创建的实例


长话短说,试着在Z_Calc方法中用“this”替换所有对“r”的引用,看看这是否能让你更进一步。我感觉还有一些错误,但这应该有助于解决这个问题。

你的确切空指针异常是什么/在哪里?这将有助于我们缩小它的范围。NPE输出应该准确地指示哪个文件+类+行-问题发生的确切位置。代表所有未来的同事,请不要使用Z_all=Z_all;或SD=SD;:)p不要害怕为变量使用实名。当变量名为单字母时,调试会困难得多。线程“main”java.lang.NullPointerException中的异常在Z_score.print(Z_score.java:80)在Z_score.main(Z_score.java:105)另外,我很抱歉,我正在尝试学习如何在没有任何正式指导的情况下编程:(您的确切空指针异常是什么/在哪里?这将帮助我们缩小它的范围。NPE输出应准确指示问题发生的文件+类+行。代表您未来的所有同事,请不要使用Z_all=Z_all;或SD=SD;:)PDon’不要害怕为变量使用实名。当变量名是单字母时,调试会困难得多。线程“main”中的异常java.lang.NullPointerException在Z_score.print(Z_score.java:80)在Z_score.main(Z_score.java:105)中的异常同样,我很抱歉,我正在尝试学习如何在没有任何正式指令的情况下编程:(为了扩展这个极好的答案,您缺少类Z_score的构造函数,这意味着Z_score.Z_All将为null,直到调用Z_score.setZ_All()。(或添加一个等效的构造函数)为了扩展这个极好的答案,您缺少类Z_score的构造函数,这意味着Z_score.Z_All将为null,直到调用Z_score.setZ_All()。(或添加一个等效的构造函数)我这样做了,它让事情变得更好。但是,正如你所怀疑的,我仍然有问题。无论出于什么原因,它只计算我的Z_专家的最后一个实例[]@斯宾塞,首先清理一下代码,去掉下划线,格式化类名,变量名,变量名,对所有变量名使用全字甚至短语,而不仅仅是字母。然后在代码中的关键点添加一些println,以帮助您了解发生了什么。如果您仍然有问题,请尝试隔离一个方法的问题,然后问另一个问题,只有格式良好的代码为该方法和一个很好的描述到底出了什么问题。我搞乱了它,终于让它工作了!非常感谢迈克!我这样做了,它使事情好多了。然而,正如你怀疑的,我仍然有问题。不管怎样
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
Z_score r = new Z_score();