Java 报 CloneNotSupportedException
异常通常是因为对象的类型不支持 Clone(克隆) 操作。在 Java 中,对象克隆是通过实现 Cloneable
接口和重写 clone()
方法来实现的。如果一个类没有实现 Cloneable
接口或者没有重写 clone()
方法,那么当调用该方法时就会抛出 CloneNotSupportedException
异常。
解决方法:
- 实现
Cloneable
接口并重写clone()
方法
Cloneable
接口并不包含任何方法,它只是起到了一个标记的作用,用于告诉 JVM 这个类可以进行克隆操作。
下面是一个示例:
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
// 其他方法
}
在这个示例中,我们实现了 Cloneable
接口,并重写了 Object
类中的 clone()
方法,将 Object
对象克隆成 Person
对象,并返回一个 Object
类型的对象,然后通过强制类型转换将其转换为 Person
对象。需要注意的是,在重写 clone()
方法时,要调用父类的 clone()
方法,否则会抛出 CloneNotSupportedException
异常。
- 实现序列化接口
还有一个解决方法是实现序列化接口,因为对象序列化的过程中也涉及到对象的拷贝。
下面是一个示例:
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 其他方法
}
在这个示例中,我们实现了 Serializable
接口,这样我们可以通过对象序列化和反序列化实现对象的克隆。
以上就是解决 CloneNotSupportedException
异常的两种方法,需要注意的是,克隆的目标对象必须是该类的一个实例,而不是该类的子类的实例,否则会抛出 CloneNotSupportedException
异常。