实例变量的值是在两个类不同。 为什么? (+更多的问题)(values of an insta

2019-11-01 23:26发布

我有一个TurnIndicator类,它的方法getTurn(); 刚刚返回“黑”的字符串,“黑”,然后选择“白色”“黑”之间交替。

在我的Board类,它结合了包中的所有类,并使其协同工作,我创建的实例TurnIndicator类, _turn ,并宣布一个实例变量_t初始值_t = _turn.getTurn(); 然后,我所定义的访问方法为_t - getT()

现在,当我打印_t的内在价值Board类,它打印“黑”,“黑”,等等。 然而,当我访问_t使用值getT()在另一个类, SelectPieceListener ,这个打印null

为什么会这样呢?

我在下方附上我的类定义。 不相关的部分都被删除。

这取决于我想要做的,最终是c == _st.checkMoveImpossible()条件,使两个选项之间的玩家选择-

1.通过点击选择按钮(在这种情况下, _cmi变为1, selectClicked()方法做期望的动作为if(_cmi == 1)块。更具体地讲,它改变的顺序_t值,从而使玩家跳过一匝), 要么

2.单击滚动按钮(在这种情况下, _cmi变成2,在做类似的事情scrollClicked()方法让当前玩家移动其他玩家的作品。)。

我只是做了_cmi == 1的情况下采取行动的工作,通过把里面的东西selectClicked()方法,但我不得不提供_cmi==2的情况下(当玩家点击滚动按钮),所以我不得不从方法分离它。

现在,我一直在努力,使其在工作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');          
        }

    }
}

Answer 1:

好,

我看你有一些事情我不会推荐。 在SelectPieceListener的_t和_st字段是不是必要的,因为你可以从_board场,为什么不断重复引用,如果它没有必要让他们?

在另一方面,我看你做了很多与==字符串comparisions的,你应该总是使用“STRING_LITERAL” .equals(变量)。

在那之后,我会建议你使用一个IDE像Eclipse这样你就可以调试代码的部分。 如果你的变量为null,它可能得到在某个时候失去了,一个调试器将是找到问题的最佳途径。



Answer 2:

你必须在董事会构造出了问题,为了应改为:

public Board() {
    _turn = new TurnIndicator();   // <---- this goes first
    _t = _turn.getTurn();
    _cmi = 0;   
}


Answer 3:

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


文章来源: values of an instance variable is different in two classes. Why? (+ more questions)