簡體   English   中英

實例變量的值在兩個類中是不同的。 為什么? (更多問題)

[英]values of an instance variable is different in two classes. Why? (+ more questions)

我有一個TurnIndicator類,及其方法getTurn(); 只是返回String “ BLACK”,“ BLACK” ,然后在“ WHITE”“ BLACK”之間切換

在將所有包中的所有類組合在一起並使其協同工作的Board類內部,我創建了TurnIndicator_turn的實例,並聲明了實例變量_t ,其初始值為_t = _turn.getTurn(); 然后,我為_t - getT()定義了一個訪問器方法。

現在,當我在Board類中打印_t值時,它將打印“ BLACK”,“ BLACK”等。 但是,當我在另一個類SelectPieceListener使用getT()訪問_t值時,將輸出null

為什么會這樣呢?

我在下面附上我的班級定義。 無關的部分被刪除。

我最終要做的是取決於c == _st.checkMoveImpossible()條件,以使游戲玩家在兩個選項之間進行選擇-

1.通過單擊選擇按鈕(在這種情況下, _cmi變為1 ,並且selectClicked()方法對if(_cmi == 1)塊執行所需的操作。更具體地說,它更改_t值的順序,以便玩家跳過一圈), 要么

2.單擊滾動按鈕(在這種情況下, _cmi變為2 ,並在scrollClicked()方法中執行類似的操作,以使當前玩家移動另一個玩家的棋子。)。

通過將所有內容放入selectClicked()方法中,我僅使_cmi == 1大小寫操作有效,但是我必須提供_cmi==2大小寫(當播放器單擊滾動按鈕時),因此必須將其與方法分離。

現在,我一直在嘗試使其在SelectPieceListener類中SelectPieceListener ,以便在以后成功的情況下將其移至Board類。

但是,我數小時的嘗試都失敗了。 我一次編碼一兩個類,這是我第一次進行具有多個類的項目。 我真的沒有這種經驗。

如果您能給我一些建議,那會對我有很大幫助。

我知道這確實是乏味的工作,但是我自己可能無法完成。.請花一些時間閱讀代碼並為我提供幫助。

public class Board {
private Structure _st;
private TurnIndicator _turn;
private String _t;
private int _cmi;

public Board() {
    _turn = new TurnIndicator();
    _t = _turn.getTurn();
    _cmi = 0;   
}

public ScrollListener getScroll(){
    return _scroll;
}

public String getT() {
    return _t;
}
public int setcmi(int cmi) {
    return _cmi = cmi;
}

public void selectClicked(char dir) {
    int index = _scroll.getX();
    HNode<ArrayList<String>> current = _st.getPosition(index);
    System.out.println("checkMoveImpossible() = " + _st.checkMoveImpossible());
    System.out.println("_t in Board = " + _t);

    if(!current.getDatum().isEmpty()) {

        if(_t == current.getDatum().get(current.getDatum().size()-1) && _cmi == 0) {
            if(0 <= index && index < 17 && index != _st.indexOfSpBack()) {
                current.forward(_t, current.getDatum().size());
            }
            else if(17 <= index && index < 25) {
                char direction = dir;
                _st.start(current, direction);
            }
            else if(index == _st.indexOfSpBack()) {
                current.backward(_t, current.getDatum().size()-1);
            }

            _t = _turn.getTurn();
            System.out.println("turn is "+ _t);
            display();
        }


        else if(_t != current.getDatum().get(current.getDatum().size()-1) && _cmi == 0) {
            String s = _t == "WHITE" ? "BLACK" : "WHITE";
            System.out.println("It's "+_t+"'s turn now and only "
            +s+" can move this piece.");
        }

    }

    if(_cmi == 1) {
        _t = _turn.getTurn();
        _cmi = 0;
        System.out.println("_cmi if block is reached");
        display();
    }
    update();

}

下面是SelectPieceListener類的定義

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class SelectPieceListener implements ActionListener {
    private Board _board;
    private Structure _st;
    private String _t;

    public SelectPieceListener(Board board) {
        _board = board;
        _st = _board.getStructure();
        _t = _board.getT();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        char c = _t == "WHITE" ? 'b' : 'w';
        _board.selectClicked('l');          
        System.out.println(_t);
        if(c == _st.checkMoveImpossible()) {
            String theOther = _t == "WHITE" ? "BLACK" : "WHITE";
            System.out.println("No possible move for "+_t+": click select to skip turn, " +
                    "or click scroll to move " + theOther + " pieces.");
            _board.setcmi(1);
            _board.update();
            _board.selectClicked('l');          
        }

    }
}

好,

我看到您有一些我不推薦的東西。 SelectPieceListener中的_t和_st字段不是必需的,因為您可以從_board字段獲取它們,為什么在不需要時保留重復的引用?

另一方面,我看到您使用==進行了很多String比較,您應該始終使用“ STRING_LITERAL” .equals(variable)。

之后,我建議您使用像Eclipse這樣的IDE,以便可以調試部分代碼。 如果您的變量為null,則在某個時候可能會丟失它,調試器將是查找問題的最佳方法。

您在Board構造函數中遇到問題,應更改順序:

public Board() {
    _turn = new TurnIndicator();   // <---- this goes first
    _t = _turn.getTurn();
    _cmi = 0;   
}
public class Board {
    private Structure _st;
    private TurnIndicator _turn; //instance variable, null before initialization
    private String _t;
    private int _cmi;

    public Board() {
    _t = _turn.getTurn(); //_turn is null, so... how do you are not getting a NPE?
    _cmi = 0;   
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM