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(...);
这也适用于克隆方法。
嗨,我正在尝试在 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(...);
这也适用于克隆方法。