Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实例变量的值在两个类中是不同的。为什么?(+更多问题)_Java_User Interface_Event Handling_Null_Actionlistener - Fatal编程技术网

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

Java 实例变量的值在两个类中是不同的。为什么?(+更多问题),java,user-interface,event-handling,null,actionlistener,Java,User Interface,Event Handling,Null,Actionlistener,我有一个TurnIndicator类,它的方法是getTurn;只需返回黑色字符串,然后在白色和黑色之间交替 在我的Board类中,它将包中的所有类组合在一起并使其工作在一起,我创建了TurnIndicator类的一个实例\u turn,并声明了一个初始值为\u t=\u turn.getTurn的实例变量\u t; 然后,我为_t-getT定义了一个访问器方法 现在,当我在Board类中打印_t值时,它会打印黑色、黑色等等。 但是,当我在另一个类SelectPieceListener中使用ge

我有一个TurnIndicator类,它的方法是getTurn;只需返回黑色字符串,然后在白色和黑色之间交替

在我的Board类中,它将包中的所有类组合在一起并使其工作在一起,我创建了TurnIndicator类的一个实例\u turn,并声明了一个初始值为\u t=\u turn.getTurn的实例变量\u t; 然后,我为_t-getT定义了一个访问器方法

现在,当我在Board类中打印_t值时,它会打印黑色、黑色等等。 但是,当我在另一个类SelectPieceListener中使用getT访问_t值时,这会输出null

为什么会这样

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

我最终想做的是,根据c==\u st.checkMoveUnabled条件,让游戏玩家在两个选项中进行选择-

一,。在这种情况下,单击“选择”按钮,_cmi变为1,如果_cmi==1块,则选择单击的方法执行所需的操作。更具体地说,它改变了t值的顺序,使玩家跳过一个回合,或者

二,。在本例中,通过单击滚动按钮,_cmi变为2,并在scrollClicked方法中执行类似操作,让当前玩家移动其他玩家的棋子

通过将所有内容放在selectClicked方法中,我只使_cmi==1 case操作起作用,但当播放器单击滚动按钮时,我必须提供_cmi==2 case,因此我必须将其与方法解耦

现在,我一直在尝试让它在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中的_t和_st字段不是必需的,因为您可以从_board字段获取它们,如果不需要,为什么要保留重复的引用

另一方面,我看到您使用==进行了很多字符串比较,您应该始终使用String_LITERAL.equalsvariable


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

如果Board构造函数中存在问题,则应更改顺序:

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

你在哪里初始化了你的_turn-in-Board类。Rohit>我忘了在这里包括初始化部分。我添加了它,就像在原始代码中一样。包括你的转向指示器代码可能会有所帮助。另外,我真正看到的唯一问题是,为什么在SelectPieceListener中,t为空。如果这是你唯一的问题,你有很多多余的信息。如果这不是你唯一需要澄清的问题,你在错误的地方初始化了它。您需要在t之前初始化_turn。因此,将initialize作为构造函数中的第一条语句移动。您确定要将正确的板实例传递给SelectPieceListener构造函数吗。看起来,您传递了一个对另一个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;   
}