2016-05-18 17 views
0

現在、Javaを使用してチェスゲームを行っていますが、問題が発生しました。チェス盤のすべてのフィールドでは、次のように入力して取得することができ、その上にチェスの駒、必要がある場合があります:ピースを移動するときに今Java:ある変数から別の変数にコンテンツを移動する

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

を、私はこのようにそれをやってみたかった:

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

問題は、フィールド1がピースの参照を保持し、ピースが削除されるようにヌルで上書きすることです。だから私の質問です:どのように私は同じ参照で両方の変数を指すことなく、別のものへのコンテンツ/参照を移動するのですか?

Btw:私は自分の作品をクローンして古いものを削除することができますが、もっと効率的なやり方があると思います。

EDIT: 関連するコード:

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

エラー:コード(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) 

作品

EDIT2:答えを受け取った後、そこに私のアイデアが完全に間違っていて、そのエラーは単純な問題によって引き起こされたことに気付きました...

+2

私はあなたの 'fieldX'クラスのコードを示しています。オブジェクトに 'Piece'インスタンスへの参照がある場合、' Piece'変数の参照を 'field1'で' null 'に設定すると、 'Piece'オブジェクト自体に何もしてはいけません。*' field1.setPiece (null) 'が** ** field2.setPiece(field1.getPiece())'の前に**呼び出されます。 – Mena

+0

@Mena Ok、関連コードと例外を共有します... – Unknown

答えて

2

問題はsetPieceメソッドのpiece.setField(this);行です。あなたがヌルオブジェクトでsetFieldを呼び出す方法をnullに設定したときと同じです。

したがって、単に `piece.setField(this);の前にヌルチェックを入れてください。

+0

もちろん、ありがとう! :) – Unknown

1

のときにpiece.setField(this)を呼び出しようとしているため、フィールド#setPieceメソッドでNullPointerExceptionが返されています。したがって、このようなコードを書き直してください。

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

もう1つは速かったと思う:D、とにかくありがとう – Unknown

関連する問題