[英]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.