2013-03-05 35 views
-3

如果我想克隆一个对象数组,但数组中有一些空元素,如何实现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; 
    } 
} 

这将抛出空指针异常。如何解决这个错误?

+0

你的代码是不能编译的......'class'不是'Class','implements'''不执行' – 2013-03-05 07:59:39

+0

即使我修好了,它也不会抛出'NullPointerException' – 2013-03-05 08:01:39

+0

Java的什么版本正在使用?@Iswanto – Tian 2013-03-05 08:11:11

回答

1

试试这个(它不会抛出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异常,但不是因为执行cloneB b;没有在Java中实例化任何东西。它只是声明一个可以指向B对象的引用。但该参考文献初始化为null。因此,调用b上的克隆将试图在不存在的对象上调用克隆。

+0

您最后的代码示例不能用Java编译。数据成员和数组确实有默认的初始化,但是局部变量没有。 – 2013-03-05 08:31:08

+0

@EyalSchneider对不起。你是对的。你会认为我必须在Input/OutputStreams初始化为try/catch块之外的所有时候都会使它不可能忽略这个事实。但不幸的是,它没有。我更新了答案以反映类似但可编辑的情况。 – Alderath 2013-03-05 08:39:01

0

克隆数组执行浅拷贝,并且空值被正确拷贝。它不会产生任何NullPointerException,除非数组变量本身为空。