我正在浏览一些旧代码并找到以下内容:
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块留空是可以的吗?
答案 0 :(得分:32)
不,不要把它留空。记录并抛出RuntimeException
。总是对你认为不可能的事情这样做 - 这样,如果不可能最终发生,它被视为意外错误(它是),而不仅仅是返回null
,好像没有发生任何坏事。
不可否认,我真的不希望你能够看到它,但以上是处理你不应该看到的错误的一般方法......
答案 1 :(得分:4)
如果您重新抛出或不抛出异常,则没有问题。您的对象MyClass永远不会抛出CloneNotSupportedEx,因为只有在未实现接口时才会抛出它。 请参阅适用于Clonable的javadoc
按照惯例,实现此接口的类应该重写 使用公共方法的Object.clone(受保护)。看到 {@link java.lang.Object#clone()}有关覆盖此内容的详细信息 方法。
请注意,此接口不包含 克隆方法。因此,无法克隆 对象仅仅是因为它实现了这个接口。 即使反射调用克隆方法,也没有 保证它会成功。