Java 实例变量的值在两个类中是不同的。为什么?(+更多问题)
我有一个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类 然而,我数小时的每一次尝试都失败了。 我一次编写一到两个类,这是我第一次用很多类做项目。我对这类事情真的没有经验 如果你能给我一些建议,那将对我帮助很大 我知道这确实是一项乏味的工作,但我可能无法独自完成这项工作。。 请花些时间阅读代码并帮助我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
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;
}