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

deep cloning in java showing null pointer exception

嗨,我正在尝试在 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 引用上直接调用方法而不实例化它。默认情况下它的值为空。在空引用上调用方法将产生 NPE。

你需要做的

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

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

您正在为浅拷贝调用 getter,如下所示:

dp1.getShallowcopy().setAge(11);

但是您从未为 shallowCopy 设置值,因此当您调用此方法时,它会被评估为 null.setAge(11); 并且在 null 上调用方法会给您空指针异常。

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

设置浅克隆
Deepcloning dp1=new Deepcloning(); 
dp1.setEmployee("solomon");
dp1.setShallowcopy(...);

这也适用于克隆方法。