public class test implements Cloneable {
@Override
public test clone() {
return (test) super.clone();
}
public static void main(String[] args) {
new test().clone();
}
}
当我尝试编译时,我得到error: unreported exception CloneNotSupportedException
(在第4行,而不是主要部分)。据我所知,实现Cloneable
的整个目的是摆脱异常。
super.clone()
?答案 0 :(得分:5)
有没有办法在不抛出或捕获异常的情况下使用super.clone()?
否,因为Object#clone()
(您使用super.clone()
调用的方法)声明了它。
接口实际上做了什么吗?
是的,但很少:如果你没有实现它,Object#clone()
将实际抛出声明的异常。
答案 1 :(得分:2)
您需要处理CloneNotSupportedException
例外,类名应以大写字母开头。
有没有办法使用super.clone()而不抛出或捕获 异常?
如果您不想在clone
方法中处理异常,请使用throws
关键字,它会将您的异常传播到被调用的方法。
public class Test implements Cloneable {
@Override
public Test clone() throws CloneNotSupportedException{
return (Test) super.clone();
}
public static void main(String[] args) {
try {
new Test().clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
接口实际上做了什么吗?
public interface Cloneable
一个类实现Cloneable
接口,以向Object.clone()
方法指示该方法合法地为该类的实例创建一个字段的字段副本。 read more
答案 2 :(得分:0)
实现Cloneable(标记接口:无方法)并不意味着摆脱Exception。它很简单,你告诉编译器,将来你可以创建实现类的对象的克隆。如果你不自动覆盖clone方法,它将调用Object类方法。
此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。
如果您不想要此功能,可以抛出相同的异常!!