线程中的异常" main" java.lang.RuntimeException:无法编译的源代码未报告的异常java.lang.CloneNotSupportedException;必须被抓住或宣布被抛出 在Test.main(Test.java:13) Java结果:1
public class Color
{
public String ColorName()
{
return "Red";
}
}
public class Test extends Color
{
public static void main(String args[])
{
Color MyShirt = new Color();
Color MyBag = (Color) MyShirt.clone();
System.out.println(MyShirt.ColorName());
System.out.println(MyBag.ColorName());
}
}
答案 0 :(得分:2)
因为您没有实施Cloneable
,Object
的默认实施clone()
只会抛出CloneNotSupportedException
;我想你想要这样的东西
public class Color implements Cloneable {
protected String name = "Red";
public String ColorName() {
return name;
}
@Override
public Object clone() {
Color c = new Color();
c.name = this.name;
return c;
}
}
答案 1 :(得分:1)
您的类必须实现java.lang.Cloneable接口。
public class Color implements Cloneable
{
public String ColorName()
{
return "Red";
}
@Override
public Color clone() {
//return your cloned Color instance
}
}
答案 2 :(得分:1)
您的类没有实现Cloneable接口,因此抛出了此异常的原因。这可以在Java API中找到。
答案 3 :(得分:1)
其他答案是正确的,指出您的类需要实现Clonable
并覆盖clone()
方法才能按预期工作:
class Color implements Clonable{
@Override
public Color clone(){
Color c = new Color();
c.name = this.name;
return c;
}
// other methods
}
然而,关于clone()
最重要的是你应该总是避免使用它。
Joshua Bloch在他的书"Effective Java"中解释说,clone()
已被彻底打破,正确地建议使用复制构造函数。您可以阅读更多相关信息here。
您应该声明一个像这样的复制构造函数,而不是使用clone()
:
class Color{
public Color(){ /* ... */ } // default constructor
public Color(Color c){
this.name = c.name; // copy all attributes
}
// other methods
}
然后用它来复制对象:
Color c = new Color();
Color other = new Color(c); // returns a copy of c