Java:将内容从一个变量移动到另一个变量

时间:2016-05-18 15:19:43

标签: java variables reference clone

我目前正在使用Java进行国际象棋游戏,我遇到了一个问题。棋盘的每个区域都可能有一个棋子,您可以通过输入以下内容获得:

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

现在,当移动一件时,我想这样做:

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

问题是,field1保留了该片段的引用,并用null覆盖它,以便删除片段。所以我的问题是:如何将变量的内容/引用移动到另一个变量,而不将两个变量都指向同一个引用?

顺便说一下:我知道,我可以克隆我的作品,然后删除旧作品,但我希望有更有效的方法。

编辑: 相关代码:

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);

错误:

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

删除代码中的最后一行(field1.setPiece(null);)时,它可以正常工作(它不会崩溃)

EDIT2:收到答案后,我意识到,我的想法完全错了,错误是由一个简单的问题造成的......

2 个答案:

答案 0 :(得分:2)

问题在于setPiece方法中的piece.setField(this);行。当你设置一个null时,如何在null对象上调用setField。

所以只需在`piece.setField(this);。

之前放置一个空检查

答案 1 :(得分:1)

您在Field#setPiece方法中获得NullPointerException,因为当作为piece.setField(this)时,您尝试调用null。所以重写这样的代码

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