CloneNotSupportedException 在对象未实现 Cloneable 接口时抛出,因 Object.clone() 默认检查该接口以确保克隆授权;正确支持克隆需实现 Cloneable、重写 public clone() 方法并调用 super.clone()。

CloneNotSupportedException 是 Java 中一个受检异常(checked exception),当调用对象的 clone() 方法,而该对象所属的类**没有实现 Cloneable 接口**时抛出。
为什么会出现 CloneNotSupportedException?
Java 的 Object.clone() 方法是受保护的(protected),其默认实现会检查当前对象的运行时类是否实现了 Cloneable 接口。这个接口本身是空的标记接口(marker interface),不包含任何方法——它的唯一作用就是向 JVM 发出“该类允许被克隆”的信号。
若未实现该接口,JVM 认为该类未授权克隆操作,于是抛出 CloneNotSupportedException,防止不安全或语义不明的复制行为。
常见触发场景
- 直接调用未实现
Cloneable的自定义类实例的clone()方法(如new Person().clone()) - 子类继承了父类的
clone()实现,但自身未声明实现Cloneable,且父类也未实现 - 使用某些工具类或框架内部调用
clone()(如旧版集合工具、部分序列化辅助逻辑),而目标对象类型未适配
如何正确支持克隆?
要让类支持浅克隆,需同时满足三个条件:
- 实现
Cloneable接口(否则抛异常) - 重写
public Object clone() throws CloneNotSupportedException方法(提升访问权限) - 在重写方法中调用
super.clone()(由Object提供基础复制逻辑)
示例:
public class User implements Cloneable {
private String name;
private int age;
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone(); // 浅克隆
}
}
注意深克隆与可变成员
即使实现了 Cloneable 并重写了 clone(),默认仍是浅克隆:对象字段中的引用类型不会被递归复制,新旧对象共享同一引用。若字段是可变对象(如 ArrayList、自定义对象),需手动克隆这些字段以实现深克隆。
例如:private List 在 clone() 中应写成 this.tags = new ArrayList(this.tags); 或调用其 clone() 方法(若支持)。










