2016-05-18 6 views
0

Ich arbeite gerade an einem Schachspiel mit Java, und ich kam über ein Problem. Jedes Feld des Schachbretts auf eine Schachfigur haben könnte, die Sie durch Eingabe erhalten können:Java: Inhalt von einer Variablen in eine andere verschieben

field.getPiece() //null or Piece-object 

Nun, wenn ein Stück zu bewegen, wollte ich es so machen:

field2.setPiece(field1.getPiece()); 
field1.setPiece(null); 

Die Problem ist, dass Feld1 die Referenz des Stückes behält und es mit Null überschreibt, so dass das Stück gelöscht wird. Also meine Frage ist: Wie verschiebe ich den Inhalt/Verweis einer Variablen auf eine andere, ohne beide Variablen auf die gleiche Referenz zu zeigen?

Btw: Ich weiß, dass ich mein Stück klonen und dann das alte löschen könnte, aber ich hoffe, es gibt eine effizientere Möglichkeit, dies zu tun.

EDIT: Relevante Code:

public class Field { 
    private Piece piece; 

    public Piece getPiece(){ return piece; } 

    public void setPiece(Piece piece){ 
     this.piece = piece; 
     piece.setField(this);    //Tell the piece on what field it is (to get position etc.) [LINE 53] 
    } 
} 

public abstract class Piece { 
    protected Field field; 
    public void setField(Field field){ 
     this.field = field; 
    } 
} 

field2.setPiece(field1.getPiece()); 
field1.setPiece(null); 

Fehler:

java.lang.NullPointerException: Attempt to invoke virtual method 'void [...].Piece.setField(Field)' on a null object reference 
at [...].Field.setPiece(Field.java:53) 

Wenn im Code die letzte Zeile zu entfernen (field1.setPiece(null);), es funktioniert (es nicht abstürzt)

EDIT2: Nachdem ich die Antwort erhalten hatte, wurde mir klar, dass meine Idee dort völlig falsch war und der Fehler durch ein einfaches Problem verursacht wurde ...

+2

Ich würde den Code für Ihre 'fieldX' Klasse zeigen. Wenn das Objekt eine Referenz auf eine 'Piece' -Instanz hat, sollte das Setzen der Referenz der' Piece' -Variable auf den Wert 'null' in' field1' nichts mit dem 'Piece'-Objekt selbst tun *, außer *' field1.setPiece (null) 'wird vor **' field2.setPiece (field1.getPiece()) 'aufgerufen. – Mena

+0

@Mena Ok, ich werde den entsprechenden Code und die Ausnahme teilen ... – Unknown

Antwort

2

Problem ist mit piece.setField(this); Zeile in SetPiece-Methode. Wie wenn Sie ein Stück null setzen, wie Sie SetField auf Null-Objekt aufrufen können.

so platzieren Sie einfach einen Null-Check vor `piece.setField (this) ;.

+0

Oh natürlich - Danke! :) – Unknown

1

Du NullPointerException in Feld # SETPIECE Methode bekommen, weil Sie versuchen, piece.setField(this) aufzurufen, wenn Stück null ist. Also schreibe Code wie folgt um

public void setPiece(Piece piece){ 
    this.piece = piece; 
    if (piece != null) { 
     piece.setField(this); 
    } 
} 
+0

Der andere war schneller ich denke: D, Danke trotzdem – Unknown