CloneNotSupportedException

CloneNotSupportedException

作为作业的一部分,我们要求使用clone方法实现一个抽象类。该函数的框架如下:

/**
 * @effects Creates and returns a copy of this.
 */
public Object clone() {
    // TODO: Implement this method


}
Shape类具有两个字段:
private Point location;
private Color color;

在说明中,我们被告知该方法不会引发CloneNotSupportedException异常,还被问到为什么会这样。在互联网上看到的所有示例中,clone方法都抛出CloneNotSupportedException

您能否指出我们此克隆方法不应引发该异常的原因。

我们编写的方法是:
/**
 * @effects Creates and returns a copy of this.
 */

public Object clone() {
    Shape new_shape = (Shape)super.clone();
    new_shape.setColor(this.getColor());
    new_shape.location = (Point)location.clone();
    return new_shape;


}

它在(Shape)super.clone()部分给我们一个错误,说:
Unhandled exception type CloneNotSupportedException,我们应该如何创建clone方法?

最佳答案

未处理的异常类型CloneNotSupportedException

这是因为clone()中的Object方法已定义为抛出CloneNotSupportedException:

protected Object clone() throws CloneNotSupportedException

请参阅API文档: Object#clone()

为了解决这个问题,您需要使用try/catch块来处理它,或者通过添加throws子句来重新定义它。

更新:

在说明中,我们被告知该方法不会引发CloneNotSupportedException异常,并且还会被问到为什么会这样。

海事组织-
  • 您正在重写超类中的方法。仅将返回类型,方法名称和参数类型视为方法签名。因此,在重写方法时,即使超类中的方法具有子类,也可以忽略子类中的throws子句。
  • 每当您的类实现Cloneable接口时,它都会告诉Object类可以对其进行克隆。在这种情况下,clone方法的正确实现应调用super.clone方法。现在,您可以看到实际上是clone类中的Object方法才真正进行复制。因此,我们应该留待Object.clone()抛出该CloneNotSupportedException。如果层次结构中的任何类都未实现Cloneable接口,它将这样做。

  • 我希望这是有道理的。

    即使它种类繁多,如果您想更多地阅读它,也可以。在Effective Java中进行了解释。

    08-18 08:42