实现Cloneable并声明CloneNotSupportedException但仍然获得CloneNotSupportedException

时间:2014-11-02 18:23:33

标签: java exception interface cloneable

我正在制作一个构建一个接收各种对象的集合的程序。但是,当我尝试克隆该集时,我得到了CloneNotSupportedException,尽管声明了CloneNotSupportedException并实现了Cloneable接口。

这是代码,

import java.util.ArrayList;

public class NewSet implements Cloneable {

private ArrayList<Object> objects;

     public NewSet() {
          this.objects=new ArrayList<Object>();
     }

     public void add(Object b) {
          if(this.contains(b)) { 
               return;
          }
          else {
               objects.add(b);
          }
     }

      public boolean contains(Object h) { 
          for(int x=0; x<this.size(); x++) {
               if(this.get(x)==h) {
                    return true;
               }

          }
          return false;
     }
      public Object get(int i) {
          return objects.get(i);
     }  

      public int size() {
          return objects.size(); 
     }

 public Object clone() throws CloneNotSupportedException {
          NewSet copy= (NewSet) super.clone();
          return copy;
     }

 public static void main(String[] args) {
   NewSet mb= new NewSet();
          mb.add("b");
          mb.add("c");
          mb.add("d");
          Object mc=mb.clone();
}
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

您没有收到CloneNotSupportedException。您从编译器收到错误,taht说由于clone方法抛出CloneNotSupportedException,您需要捕获异常,或者在throws子句中声明它,就像任何其他已检查的异常一样:

  

未报告的异常java.lang.CloneNotSupportedException;必须被抓住或宣布被抛出

答案 1 :(得分:2)

您收到该错误是因为clone()可以将CloneNotSupportedException委托给来电者,但您可以在那里处理可能的例外情况。为此,请使用try / catch块围绕Object mc=mb.clone();方法中的main行:

public static void main(String[] args) {
    NewSet mb = new NewSet();
    mb.add("b");
    mb.add("c");
    mb.add("d");
    Object mc = null;
    try {
        mc = mb.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
}

现在main方法处理方法调用CloneNotSupportedException的可能mb.clone()异常。

main方法中处理该异常的另一种方法是将throws添加到方法中:

public static void main(String[] args) throws CloneNotSupportedException {
    NewSet mb = new NewSet();
    mb.add("b");
    mb.add("c");
    mb.add("d");
    Object mc = mb.clone();
}