Cloneable抛出CloneNotSupportedException

时间:2015-01-29 12:00:55

标签: java clone cloneable

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()
  • 界面实际上做了什么吗?

3 个答案:

答案 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类方法。

  1. 你必须抛出Exception作为重写方法的签名。
  2. 用于识别您的对象是否可以克隆。
  3. 正如你在Java Doc中看到的那样

      

    此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。

    如果您不想要此功能,可以抛出相同的异常!!