何时抛出CloneNotSupportedException?

use*_*270 25 java

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

public class MyClass implements Cloneable {

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

}
Run Code Online (Sandbox Code Playgroud)

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

那么可以将捕获块留空吗?

Jon*_*eet 33

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

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

  • 问答5分钟,答案中有72个字.如果问题在一两分钟内被发现并且答案不需要研究,那么期望计算机专业人员能够以18-24 wpm的速度输入是合理的. (3认同)
  • 你怎么这么快回答这个问题呢?Sheesh,我开始相信"Jon Skeet事实":) (2认同)

Rod*_*sio 5

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

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

请注意,这个接口并没有包含clone方法。因此,不能仅仅凭借对象实现了这个接口就克隆一个对象。即使以反射方式调用 clone 方法,也不能保证它会成功。