Java 对未实现可克隆接口的对象调用clone()方法时未引发CloneNotSupportedException

Java 对未实现可克隆接口的对象调用clone()方法时未引发CloneNotSupportedException,java,Java,我最近开始了Java编程,根据JavaSEAPI文档,实现了Cloneable接口以指示允许在该类上进行克隆操作。如果不是,则抛出一个CloneNotSupportedException。然而,在一次实践会话中,我成功地运行了一个程序,该程序克隆了一个不实现可克隆接口的类,并且没有引发任何异常。我需要知道为什么没有抛出异常。我正在Windows 7上使用JDK 6 update 45和最新的Eclipse IDE。代码如下: package com.warren.project.first;

我最近开始了Java编程,根据JavaSEAPI文档,实现了Cloneable接口以指示允许在该类上进行克隆操作。如果不是,则抛出一个CloneNotSupportedException。然而,在一次实践会话中,我成功地运行了一个程序,该程序克隆了一个不实现可克隆接口的类,并且没有引发任何异常。我需要知道为什么没有抛出异常。我正在Windows 7上使用JDK 6 update 45和最新的Eclipse IDE。代码如下:

package com.warren.project.first;

public class PracticeClass {

   //explicit initialisation of PracticeClass Instance Variables
   private int fieldOne=1;
   private int fieldTwo=2;
   private int fieldThree=3;

   //setters and getters for instance fields of PracticeClass
   public void setField1(int field1){
     this.fieldOne=field1;
   }

   public void setField2(int field2){
     this.fieldTwo=field2;
   }

   public void setField3(int field3){
     this.fieldThree=field3;
   }

   public int getField1(){
     return this.fieldOne;
   }

   public int getField2(){
     return this.fieldTwo;
   }

   public int getField3(){
     return this.fieldThree;
   }


   //This method clones the PracticeClass's instances and returns the clone
   @Override
   public PracticeClass clone(){
      PracticeClass practiceClass= this;
      return practiceClass;
   }

}


package com.warren.project.first;

public class AppMain {

  public static void main(String[] args) {      
    //Create PracticeClass Object
    PracticeClass pc1=new PracticeClass();

    //Set its instance fields using setters
    pc1.setField1(111);
    pc1.setField2(222);
    pc1.setField3(333);

    //Display Values to screen
    System.out.println(pc1.getField1()+" "+pc1.getField2()+" "+pc1.getField3());

    //Create clone of PracticeClass object
    PracticeClass pc2=pc1.clone();

    //Print values from PracticeClass clone object
    System.out.println(pc2.getField1()+" "+pc2.getField2()+" "+pc2.getField3());
  }

}

此代码在没有引发任何异常的情况下成功执行。为什么不抛出CloneNotSupportedException

为了抛出
CloneNotSupportedException
,必须在自己的
clone()
方法中调用
super.clone()
。此方法将验证您的类是否实现了
Cloneable

,是否不确定您在做什么。您在类中创建了一个名为
clone()
的方法,并调用了它。您预计会发生什么?此方法不是克隆,
pc1
pc2
是同一个对象。@Dahaka这不是问题,问题是为什么该方法不会引发对象中指定的预期异常contract@morgano我知道,但是没有必要使用
clone()
如果它只是执行与
pc2=pc1相同的操作,那么他/她并不真的想克隆该对象,而是验证在覆盖clone()的类上调用clone()是否会引发CloneNotSupportedException(如果它没有实现CloneableAgree),但为什么我们需要添加super.clone()?我们正在重写一个方法,该方法不需要super。()来调用。它是可选的。