什么时候会抛出CloneNotSupportedException?

28

我正在查看一些旧代码,发现了以下内容:

public class MyClass implements Cloneable {

    public Object clone() {
        Object o = null;
        try {
            o = super.clone();
        } catch (CloneNotSupportedException ex) {
        }
        return o;
    }

}

我已经阅读了Object.clone()的Javadocs,我正在尝试弄清楚为什么要加这个catch块。我的意思是,如果我只是默认地扩展Object,并且这个类实现了Cloneable,那么它是否会被执行到呢?如果这个类被扩展并且子类没有实现Cloneable,那么这个catch块就有用了吗?

那么,把catch块留空是可以的吗?

2个回答

36

不要将它留空。记录并抛出RuntimeException。对于您认为不可能的事情,始终这样做-这样,如果不可能最终发生,它将被视为意外错误(它确实是),而不仅仅是返回null,好像没有发生任何问题。

诚然,我真的不希望您看到它,但以上是一种通常处理不应看到的错误的方法...


3
你怎么这么快就回答了这个问题?天哪,我开始相信“Jon Skeet的事实”了 :) - MetroidFan2002
1
如果有人拿刀逼迫我使用Object.clone,我会使用throw new Error(exc); - Tom Hawtin - tackline
4
问题和回答之间有5分钟的时间,回答中有72个单词。如果问题在一两分钟内被发现,并且回答不需要研究,那么合理地期望计算机专业人员能够以18-24个字每分钟的速度打字。 - Rich Seller

5
如果你不重新抛出异常,也没有问题。因为当接口未被实现时,MyClass 对象永远不会抛出 CloneNotSupportedException 异常。请参阅 Clonable 的 javadoc。
按照惯例,实现此接口的类应该使用公共方法覆盖受保护的 Object.clone 方法。有关覆盖此方法的详细信息,请参阅 java.lang.Object#clone()。请注意,此接口包含 clone 方法。因此,仅凭实现此接口不能克隆对象。即使通过反射调用 clone 方法,也不能保证成功。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接