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 ...
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
@Mena Ok, ich werde den entsprechenden Code und die Ausnahme teilen ... – Unknown