2011-11-27 91 views
0

我想複製一個沒有成功的對象。我試圖複製對象

  1. 系列化
  2. 克隆

兩種方法沒有爲我工作。

當我使用序列化(我正在使用這裏指定的技術Faster Deep Copies of Java Objects)我得到NullPointerException。通過克隆,我獲得了原始對象參考。

方案是:

我有數據char[][] board和擴展類B一個抽象類A。我要複製的數據board爲了這個,我實現了兩個方法在B - getboard()setboard()並實施了克隆方法,使得

B b1 = new B; 
B.initialize(); 
B b2 new B; 
B2 = B1.clone(B2) 

但是,這是行不通的。任何幫助,將不勝感激。

感謝:-)

 public B clone() { 

      B N = new B(); 
      try { 
        N = (B)super.clone(); 
      } catch (CloneNotSupportedException e) { 
        e.printStackTrace(); 
      } 
      N.setBoard(this.getBoard()); 
      return N; 
    } 

關於序列化,反序列化後,當我嘗試畫它給我NullPointerException董事會。我的結論是,反序列化不能正常工作。

+0

顯示您的克隆方法內部的代碼。 – Beginner

+0

你知道你爲什麼得到一個空指針嗎?序列化技術是相當常用的。 – david

+0

您應該將該代碼添加到帖子本身作爲更新。 –

回答

0

隨着時間的推移,我發現使用第三方庫進行對象克隆可能是一種挽救生命的方法。一個我建議的項目是「克隆」,可在http://code.google.com/p/cloning/

下面是一個例子:

Cloner cloner=new Cloner(); 

MyClass clone=cloner.deepClone(o); 
// clone is a deep-clone of o 
+0

我不能使用第三方庫:-( – Shew

1

覆蓋的clone方法B

public class B { 
    private int f1; 
    private String f2; 

    @Override 
    public B clone() { 
     B clone = new B(); 
     clone.f1 = this.f1; 
     clone.f2 = this.f2; 
     return clone; 
    } 
} 

並用它來創建重複:

B b1 = new B(); 
//... 
B b2 = b1.clone(); 

更新:

public B clone() { 
     B N = new B(); 
     try { 
       N = (B)super.clone(); 
     } catch (CloneNotSupportedException e) { 
       e.printStackTrace(); 
     } 
     N.setBoard(this.getBoard()); 
     return N; 
} 

請嘗試以下(假設B工具Cloneable):

@Override 
public B clone() throws CloneNotSupportedException { 
    return (B) super.clone(); 
} 

更新:

自實施board

class B implements Cloneable { 
    private char[][] board; 

    @Override 
    public B clone() throws CloneNotSupportedException { 
     B clone = (B) super.clone(); 
     clone.board = new char[this.board.length][]; 
     for(int i=0; i<this.board.length; i++) { 
      clone.board[i] = new char[this.board[i].length]; 
      System.arraycopy(this.board[i], 0, clone.board[i], 0, this.board[i].length); 
     } 
     return clone;   
    } 

    public char[][] getBoard() { 
     return board; 
    } 

    public void setBoard(char[][] board) { 
     this.board = board; 
    } 

    @Override 
    public String toString() { 
     return Arrays.deepToString(this.board); 
    } 
} 
+0

clone()不應該使用new B()。如果B是子類,這將會中斷,使用B clone =(B)super.clone(); – MeBigFatGuy

+0

@MeBigFatGuy:I (B)super.clone();','super.clone()'如何返回一個'B'的實例。超類(在這種情況下是'Object')甚至不知道'B'。你能解釋一下嗎? –

+0

@MeBigFatGuy:沒關係,我明白了。謝謝。 –