7
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()不抛出或捕获异常的情况下使用?
  • 接口实际上有什么作用吗?
4

3 回答 3

8

有没有办法使用 super.clone() 而不抛出或捕获异常?

不,因为Object#clone()(您调用的方法super.clone())声明了它。

接口实际上有什么作用吗?

是的,但很少:如果你不实现它,Object#clone()实际上会抛出声明的异常。

于 2015-01-29T12:04:11.650 回答
4

您需要处理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()方法指示该方法制作该类实例的逐个字段副本是合法的。阅读更多

于 2015-01-29T12:06:23.847 回答
2

实现 Cloneable(marker interface: no methods) 并不意味着摆脱异常。它很简单,您告诉编译器将来您可以创建实现类对象的克隆。如果您不自动覆盖克隆方法,它将调用 Object 类方法。

  1. 您必须抛出异常作为其重写方法的签名。
  2. 它确定您的对象是否可以被克隆。

正如您在 Java Doc 中看到的:

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

如果你不想要这个功能,你可以抛出同样的异常!!

于 2015-01-29T12:24:12.157 回答