在Java中生成克隆函数而不引发CloneNotSupportedException异常

在Java中生成克隆函数而不引发CloneNotSupportedException异常,java,clone,Java,Clone,作为家庭作业的一部分,我们被要求使用clone方法实现一个抽象类。函数的框架如下所示: /** * @effects Creates and returns a copy of this. */ public Object clone() { // TODO: Implement this method } Shape类有两个字段: private Point location; private Color color; 在说明中,我们被告知该方法不会抛出CloneNotSu

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

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


}
Shape
类有两个字段:

private Point location;
private Color color;
在说明中,我们被告知该方法不会抛出
CloneNotSupportedException
异常,并且还被询问为什么会这样。在我们在互联网上看到的所有例子中,克隆方法都会抛出一个
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()部分给出了一个错误,它说:


未处理的异常类型CloneNotSupportedException
,我们应该如何创建克隆方法?

您的类应该实现接口

还可以使用以返回形状/点而不是对象。这有助于避免不必要的类型转换

未处理的异常类型CloneNotSupportedException

这是因为
对象中的
clone()
方法定义为抛出
CloneNotSupportedException

protected Object clone() throws CloneNotSupportedException
见API文件:

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

更新:

在说明中,我们被告知该方法不会抛出CloneNotSupportedException异常,并且还被询问为什么会这样

国际海事组织-

  • 您正在重写超类中的方法。只有返回类型、方法名称和参数类型被视为方法签名。因此,在重写方法时,可以忽略子类中的throws子句,即使超类中的方法有它
  • 每当类实现
    Cloneable
    接口时,它都会告诉
    对象
    类可以对其进行克隆。在这种情况下,
    clone
    方法的正确实现应该调用
    super.clone
    方法。现在,您可以看到实际上是
    Object
    类中的
    clone
    方法创建了副本。因此,我们应该让
    Object.clone()
    抛出
    CloneNotSupportedException
    。如果层次结构中的任何类没有实现
    Cloneable
    接口,它就会这样做
  • 我希望这是有道理的


    即使它有点大,以防你想读更多。其他实现抛出CloneNotSupportedException的原因是它是现有系统的一部分。仅仅因为定义了一个方法来抛出异常并不意味着它必须这样做。在Shape及其派生类上实现clone()方法时,不要抛出异常


    (Shape)super.clone()
    引发异常的原因是这是默认行为。在形状上实现clone()。

    我已更新了答案。我希望它能帮助你。