如何在java中包含空元素时克隆数组
如果我想克隆一个对象数组,但数组中有一些空元素,如何实现clone()方法?例如:如何在java中包含空元素时克隆数组
class A {};
class B implements Cloneable {
A[] arrayFoo = new A[maxNumber];
// let some elements in arrayFoo be null
// now I want to implement a clone method
public B clone() throws CloneNotSupportedException {
B result = (B) super.clone()
return result;
}
}
这将抛出空指针异常。如何解决这个错误?
试试这个(它不会抛出NullPointerException):
class A {};
class B implements Cloneable {
public static final int MAX_NUMBER = 42;
A[] arrayFoo = new A[MAX_NUMBER];
// let some elements in arrayFoo be null
// now I want to implement a clone method
public B clone() throws CloneNotSupportedException {
B result = (B) super.clone();
return result;
}
public static void main(String[] args) throws CloneNotSupportedException {
B b1 = new B();
B b2 = b1.clone();
System.out.println("Done!");
}
}
结论: 当你发布这样的问题,总是正是在指定的NullPointerException异常发生的代码行,ALWAYS确保该问题中发布了该特定行。
我的猜测(如果从C++背景是)是你在一个成员变量调用仅克隆声明:
B b;
这将抛出一个NullPointerException异常,但不是因为执行clone
。 B b;
没有在Java中实例化任何东西。它只是声明一个可以指向B
对象的引用。但该参考文献初始化为null
。因此,调用b
上的克隆将试图在不存在的对象上调用克隆。
您最后的代码示例不能用Java编译。数据成员和数组确实有默认的初始化,但是局部变量没有。 – 2013-03-05 08:31:08
@EyalSchneider对不起。你是对的。你会认为我必须在Input/OutputStreams初始化为try/catch块之外的所有时候都会使它不可能忽略这个事实。但不幸的是,它没有。我更新了答案以反映类似但可编辑的情况。 – Alderath 2013-03-05 08:39:01
克隆数组执行浅拷贝,并且空值被正确拷贝。它不会产生任何NullPointerException,除非数组变量本身为空。
你的代码是不能编译的......'class'不是'Class','implements'''不执行' – 2013-03-05 07:59:39
即使我修好了,它也不会抛出'NullPointerException' – 2013-03-05 08:01:39
Java的什么版本正在使用?@Iswanto – Tian 2013-03-05 08:11:11