何时抛出CloneNotSupportedException?

时间:2009-07-17 14:49:17

标签: java

我正在浏览一些旧代码并找到以下内容:

public class MyClass implements Cloneable {

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

}

我已经阅读了Object.clone()上的javadocs,我正在试图找出为什么这个问题就在那里。我的意思是,我明白它必须在那里,因为Object.clone()会抛出它,但是什么时候它会到达那里,如果我只是默认扩展Object,而这个类正在实现Cloneable?如果这个类被扩展并且子类没有实现Cloneable,那它就是它的用途吗?

将catch块留空是可以的吗?

2 个答案:

答案 0 :(得分:32)

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

不可否认,我真的希望你能够看到它,但以上是处理你不应该看到的错误的一般方法......

答案 1 :(得分:4)

如果您重新抛出或不抛出异常,则没有问题。您的对象MyClass永远不会抛出CloneNotSupportedEx,因为只有在未实现接口时才会抛出它。 请参阅适用于Clonable的javadoc

  

按照惯例,实现此接口的类应该重写   使用公共方法的Object.clone(受保护)。看到   {@link java.lang.Object#clone()}有关覆盖此内容的详细信息   方法。

请注意,此接口包含   克隆方法。因此,无法克隆   对象仅仅是因为它实现了这个接口。   即使反射调用克隆方法,也没有   保证它会成功。