在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()。我已更新了答案。我希望它能帮助你。