java中显示空指针异常的深度克隆
嗨,我想用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
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解决方案是:不要重新发明轮子。有一些框架可以帮助您做到这一点。