Java Cloneable抛出CloneNotSupportedException

Java Cloneable抛出CloneNotSupportedException,java,clone,cloneable,Java,Clone,Cloneable,当我试图编译它时(在第4行,不是主代码),我得到了错误:未报告的异常CloneNotSupportedException。据我所知,实现Cloneable的整个目的就是为了消除异常 有没有一种方法可以在不引发或捕获异常的情况下使用super.clone() 界面真的做了什么吗 有没有一种方法可以在不引发或捕获异常的情况下使用super.clone() 否,因为对象#clone()(使用super.clone()调用的方法)声明了它 界面真的做了什么吗 是的,但很少:如果不实现它,Object

当我试图编译它时(在第4行,不是主代码),我得到了
错误:未报告的异常CloneNotSupportedException
。据我所知,实现
Cloneable
的整个目的就是为了消除异常

  • 有没有一种方法可以在不引发或捕获异常的情况下使用
    super.clone()
  • 界面真的做了什么吗
有没有一种方法可以在不引发或捕获异常的情况下使用super.clone()

否,因为
对象#clone()
(使用
super.clone()
调用的方法)声明了它

界面真的做了什么吗


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

您需要处理
CloneNotSupportedException
异常,类名应该以大写字母开头

有没有一种方法可以使用super.clone()而不抛出或捕获 例外

如果您不想在
clone
方法中处理异常,那么使用
throws
关键字,它会将您的异常传播到被调用的方法

public class test implements Cloneable {
    @Override
    public test clone() {
        return (test) super.clone();
    }

    public static void main(String[] args) {
        new test().clone();
    }
}
界面真的做了什么吗

类实现了
Cloneable
接口,以向
Object.clone()
方法指示该方法为该类的实例创建字段副本是合法的

实现Cloneable(标记接口:无方法)并不意味着摆脱异常。很简单,您告诉编译器,将来可以创建实现类对象的克隆。如果不自动重写克隆方法,它将调用对象类方法

  • 您必须抛出异常作为其重写方法的签名
  • 确定对象是否可以克隆是很重要的
  • 正如您在Java文档中看到的:

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


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

    您尚未处理main中出现的异常method@user2900314这应该是哪个异常?(new test().clone())将引发异常,异常为CloneNotSupportedException。@user2900314很有趣。那么,请解释一下
    main
    方法应该如何引发此异常。但首先请注意,唯一可以引发此异常的方法是
    super.clone()
    而此调用位于
    try/catch
    块内。@user2900314我已经编辑了我的代码,以前的代码也是正确的,因为它在clone方法中处理
    编译时
    异常。如果在运行时出现任何异常,java将负责处理
     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