2013-03-05 57 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,除非數組變量本身爲空。