子类错误:克隆不支持异常永远不会在 try 正文中引发



我现在正在做一个关于继承和深度克隆的交手。

交接是关于使用继承和深度克隆的想法重写提供给我们的代码,使用将形状绘制到画布上的程序。

现在我已经为超类point和我的子类group实现了clone()方法,但是当它编译时,我总是对子类中的clone()CloneNotSupportedException,我真的不明白为什么。

这是我的超类的代码:

public abstract class Point implements Cloneable
{
public Point clone() 
{
try {
Point copy = (Point)super.clone();
copy.imgGroup = (ArrayList<Point>)imgGroup.clone();
return copy;
}
catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
}

这是我的子类的代码:

public class Group extends Point implements Cloneable
{
public Group clone() 
{
try {
Group copy = (Group)super.clone();
copy.group = (ArrayList<Point>)group.clone();
for (int i = 0; i < group.size(); i++) {
copy.group.set(i,group.get(i).clone());
}
return copy;
}
catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
}

任务:

构造类Group。可以将某个Figure对象添加到多个不同的组中。您必须确定同一个Figure对象是否可以同时属于多个组。在这项工作中,这种情况不应该发生。所有Group对象都必须独占地拥有其项对象。多个组之间不得共享对象。

因此,我们从添加方法开始:

public Figure class clone ();
// (define it in the same style as on page 4 in the document below)
// this was what point clone() was in the class Point.

在此之后,有关于实现一些方法和Group克隆的说明。

因此,在此任务中,我应该使用各种方法以及新clone()来实现Group,这就是我现在遇到的问题。

我希望你能帮助我指出正确的方向,只是想知道为什么会这样。谢谢!

我总是在我的子类中得到一个带有clone((的CloneNotSupportedException

我想你得到的是;Unreachable catch block for CloneNotSupportedException.

这是因为您在超类签名中省略了throws CloneNotSupportedException。但是,在子类中,您希望super.clone()抛出已检查的CloneNotSupportedException。将超类实现更改为;

public abstract class Point implements Cloneable {
public Point clone() throws CloneNotSupportedException { 
Point copy = (Point) super.clone(); 
return copy;
}
}

以便超类签名中引发的异常对子类可见。

更新

为了更清楚起见,请按照下面的评论进行操作。

更新 2

添加更多详细信息,因为另一个答案已被用户删除(我上面的评论指的是(。

您不能实例化抽象类 - 但您仍然可以在其中使用clone()方法。但是抽象类应该在其克隆方法中返回的具体克隆实例是什么?当您在抽象类中说thissuper.clone()时,这两者都在运行时引用同一个子类实例。这意味着浅拷贝(Point copy = (Point) super.clone();(是你的情况下Group的实例。您可以在抽象超类的clone方法中添加System.out.println(super.clone().getClass())来见证这一点。

因此,您可以在超级抽象类中深度克隆可继承属性 - 和 - 在子类的clone((方法中仅深度克隆子类的属性。这样,如果定义了多个子类,则可以避免在所有子类中深度克隆超类属性。

最新更新