作为作业的一部分,我们要求使用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异常,并且还会被问到为什么会这样。
海事组织-
Cloneable
接口时,它都会告诉Object
类可以对其进行克隆。在这种情况下,clone
方法的正确实现应调用super.clone
方法。现在,您可以看到实际上是clone
类中的Object
方法才真正进行复制。因此,我们应该留待Object.clone()
抛出该CloneNotSupportedException
。如果层次结构中的任何类都未实现Cloneable
接口,它将这样做。 我希望这是有道理的。
即使它种类繁多,如果您想更多地阅读它,也可以。在Effective Java中进行了解释。