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

时间:2013-04-04 08:10:29

标签: java user-interface event-handling null actionlistener

我有一个TurnIndicator类,它的方法getTurn();只返回“BLACK”,“BLACK”的字符串,然后在“WHITE”之间交替< / em>和“BLACK”

在我的Board类中,它结合了包中的所有类并使它一起工作,我创建了一个TurnIndicator类的实例,_turn,并声明了一个实例变量{{ 1}},初始值为_t 然后,我为_t = _turn.getTurn(); - _t定义了一个访问器方法。

现在,当我在getT()类中打印_t值时,会打印“BLACK”,“BLACK”,依此类推。 但是,当我在另一个类Board中使用_t访问getT()值时,会打印 SelectPieceListener

为什么会这样?

我在下面附上我的课程定义。不相关的部分被删除。

我最终想要做的是取决于null条件,让游戏玩家在两个选项之间做出选择 -

点击“选择”按钮

1。(在这种情况下,c == _st.checkMoveImpossible()变为 1 _cmi方法为selectClicked()阻止执行所需操作。更具体地说,它会更改if(_cmi == 1)值的顺序,以便玩家跳过一个回合),或

单击滚动按钮

2。(在这种情况下,_t变为 2 ,并在_cmi方法中执行类似操作以让当前玩家移动其他玩家的作品。)。

我通过将所有内容放在scrollClicked()方法中,只做_cmi == 1案例操作,但我必须提供selectClicked()个案(当玩家点击滚动按钮时),所以我有将它与方法分离。

现在,我一直试图让它在_cmi==2课程中工作,这样如果我成功,我可以稍后将它移到SelectPieceListener课程。

但是,我几个小时的尝试都失败了。 我一次编写了一两个类,这是我第一次用很多类编写项目。我真的对这种事情缺乏经验。

如果你能给我一些建议,那将对我有所帮助。

我知道这是一项非常繁琐的工作,但我自己可能无法做到这一点。 请花一些时间阅读代码并帮助我。

Board

下面是SelectPieceListener类定义

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

}

3 个答案:

答案 0 :(得分:1)

那么,

我看到你有一些我不推荐的东西。 SelectPieceListener中的_t和_st字段不是必需的,因为你可以从_board字段中获取它们,为什么在没有必要时保留重复的引用呢?

另一方面,我看到你用==做了很多String比较,你应该总是使用“STRING_LITERAL”.equals(变量)。

之后,我建议您使用像Eclipse这样的IDE,以便调试部分代码。如果你的变量为null,它可能会在某些时候丢失,调试器将是找到问题的最佳方法。

答案 1 :(得分:0)

您在Board构造函数中遇到问题,订单应该更改:

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

答案 2 :(得分: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;   
}