java中显示空指针异常的深度克隆

java中显示空指针异常的深度克隆,java,clone,Java,Clone,嗨,我想用java制作一个简单的深度克隆示例 public class Deepcloning implements Cloneable { public Shallowcloning shallowcopy; public Deepcloning() { } public Shallowcloning getShallowcopy() { return shallowcopy; } public void setShallowco

嗨,我想用java制作一个简单的深度克隆示例

public class Deepcloning implements Cloneable
{
    public Shallowcloning shallowcopy;
    public Deepcloning() {
    }
    public Shallowcloning getShallowcopy() {
        return shallowcopy;
    }
    public void setShallowcopy(Shallowcloning shallowcopy) {
        this.shallowcopy = shallowcopy;
    }
    public String getEmployee() {
        return employee;
    }
    public void setEmployee(String employee) {
        this.employee = employee;
    }
    private String employee;

    public Object clone() throws CloneNotSupportedException{

        Deepcloning shls=(Deepcloning)super.clone();
        shls.setShallowcopy((Shallowcloning)shallowcopy.clone());
        return shls;
    }
}
在主要的实现方法上

public class Clonningimplementation {

    public static void main(String[] args) {

        try {

            Deepcloning dp1 = new Deepcloning();
            dp1.setEmployee("solomon");

            dp1.getShallowcopy().setAge(11);
            dp1.getShallowcopy().setSalary(3000);


            System.out.println("orignal copy employee" + dp1.getEmployee());
            System.out.println("orignal copy employee" + dp1.getShallowcopy().getAge());
            System.out.println("orignal copy employee" + dp1.getShallowcopy().getSalary());
        } catch (ClonenotSupportedException e) {
            e.printstacktrace();
        }

        ...
    }
    ...
}
运行此代码时,我收到空指针异常。在深度克隆中,我应该克隆我已经做过的参考文献,但仍然没有得到结果。如果能得到任何帮助,我们将不胜感激

dp1.getShallowcopy().setAge(11);
您直接调用shallowcopy引用上的方法,而不实例化它。默认情况下,它的值为空。对null引用调用方法将给出NPE

你需要做什么

Deepcloning dp1=new Deepcloning(); dp1.setEmployee("solomon");
dp1.setShallowcopy(new Shallowcloning ());
dp1.getShallowcopy().setAge(11);;
dp1.getShallowcopy().setSalary(3000);

默认情况下,每个对象都初始化为null,并且是您的shallowcopy

您正在为shallowcopy调用getter,如下所示:

dp1.getShallowcopy().setAge(11);
但您从未为shallowCopy设置过值,因此当您调用此方法时,它的计算结果为null.setAge11;对null调用方法会导致null指针异常

为了避免这种情况,您可能需要使用

Deepcloning dp1=new Deepcloning(); 
dp1.setEmployee("solomon");
dp1.setShallowcopy(...);

这同样适用于克隆方法。

异常堆栈跟踪??您应该阅读此问题/a:以及解决方案。请参阅我答案的最后几行。@user3878073解决方案是:不要重新发明轮子。有一些框架可以帮助您做到这一点。