【问题标题】:Cloneable throws CloneNotSupportedException可克隆抛出 CloneNotSupportedException
【发布时间】:2015-03-28 15:40:00
【问题描述】:
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() 而不抛出或捕获异常?
  • 界面实际上有什么作用吗?

【问题讨论】:

    标签: java clone cloneable


    【解决方案1】:

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

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

    正如您在 Java Doc 中看到的那样:

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

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

    【讨论】:

      【解决方案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

      【讨论】:

      • 你还没有处理main方法中出现的异常
      • @user2900314 那应该是哪个例外?
      • (new test().clone() 会抛出异常,异常为CloneNotSupportedException。
      • @user2900314 很有趣。好吧,那么请解释一下,main 方法应该如何抛出这个异常。但请注意,唯一可以抛出此异常的方法是 super.clone(),而此调用位于 try/catch 块内。
      • @user2900314 我已经编辑了我的代码,之前的代码也是正确的,因为它在克隆方法中处理Compile Time 异常。如果在运行时出现任何异常,将由 java 处理
      【解决方案3】:

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

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

      这个界面真的有什么作用吗?

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

      【讨论】:

        猜你喜欢
        • 2021-03-01
        • 2013-05-30
        • 2022-01-11
        • 1970-01-01
        • 2016-01-05
        • 1970-01-01
        • 2018-12-06
        • 2013-09-22
        • 1970-01-01
        相关资源
        最近更新 更多