可克隆抛出 CloneNotSupportedException

Cloneable throws CloneNotSupportedException

public class test implements Cloneable {
    @Override
    public test clone() {
        return (test) super.clone();
    }

    public static void main(String[] args) {
        new test().clone();
    }
}

当我尝试编译它时得到 error: unreported exception CloneNotSupportedException(在第 4 行,不是主要的)。据我所知,实施 Cloneable 的全部目的是摆脱异常。

Is there a way to use super.clone() without throwing or catching the exception?

否,因为 Object#clone()(您使用 super.clone() 调用的方法)声明了它。

Does the interface actually do anything?

是的,但很少:如果你不实现它,Object#clone()实际上会抛出声明的异常。

您需要处理 CloneNotSupportedException 异常,Class 名称应以大写字母开头。

Is there a way to use super.clone() without throwing or catching the exception?

如果您不想在 clone 方法中处理异常,那么使用 throws 关键字它会将您的异常传播到被调用的方法。

 public class Test implements Cloneable {
    @Override
    public Test clone() throws CloneNotSupportedException{
         return (Test) super.clone();
    }

    public static void main(String[] args) {
        try {
            new Test().clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

Does the interface actually do anything?

public interface Cloneable

A class 实现了 Cloneable 接口,以向 Object.clone() 方法指示该方法对 Object.clone() 的实例进行逐字段复制是合法的=27=]。 read more

实施Cloneable(标记接口:无方法)并不意味着摆脱异常。很简单,您是在告诉编译器将来您可以创建实现 class 的对象的克隆。如果您不自动覆盖克隆方法,它将调用 Object class 方法。

  1. 你必须抛出异常作为重写方法的签名。
  2. 确定您的对象是否可以被克隆。

如您在 Java 文档中所见:

This interface does not contain the clone method. Therefore, it is not possible to clone an object merely by virtue of the fact that it implements this interface. Even if the clone method is invoked reflectively, there is no guarantee that it will succeed.

如果您不想要此功能,您可以抛出相同的异常!!