我正在制作一个3x3网格类型的应用程序,我想回想一下按下按钮以通过添加for循环来更改它。但是,我得到异常“java.lang.ArrayIndexOutOfBoundsException:length = 3; index = 3”,因为for循环很奇怪。有谁可以为我找到这个?我是java和编程的新手。
代码:
public int j = 1;
public int i = 1;
public final int[][] buttons = new int[][] {
{R.id.top_left_button, R.id.top_center_button, R.id.top_right_button},
{R.id.left_button, R.id.center_button, R.id.right_button},
{R.id.bottom_left_button, R.id.bottom_center_button, R.id.bottom_right_button}};
private Button lastButton;
public void setPlayer(Button button, int x, int y){
button.setText("!");
lastButton = (Button)findViewById(buttons[x][y]);
lastButton.setText(" ");
lastButton = button;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
ctx = this;
final GameEngine game = new GameEngine();
lastButton = (Button)findViewById(R.id.center_button);
for (i = 0; i < buttons.length; i++) {
for (j = 0; j < buttons[i].length; j++) {
final Button button = (Button)findViewById(buttons[i][j]);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Button b = (Button)v;
int x = i;
int y = j;
setPlayer(b, x , y);
}
});
}
}
答案 0 :(得分:3)
您需要问的问题是:点击按钮后,i
和j
的值是什么?
i
的答案是:buttons.length.
因为这是您离开循环时离开i
的值。
这应该有效:
for (i = 0; i < buttons.length; i++) {
final int iCopy = i;
for (j = 0; j < buttons[i].length; j++) {
final Button button = (Button)findViewById(buttons[i][j]);
final int jCopy = j;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Button b = (Button)v;
int x = iCopy;
int y = jCopy;
setPlayer(b, x , y);
}
});
}
}
这将起作用的原因是,由于范围界定,您正在使用每个外部迭代创建iCopy
的新实例,并在每次内部迭代时创建jCopy
的新实例。现在,每个匿名OnClickListener
实现都将使用适当的副本。
答案 1 :(得分:1)
您应该声明并初始化您的数组:
public final int[][] buttons = {
{R.id.top_left_button, R.id.top_center_button, R.id.top_right_button},
{R.id.left_button, R.id.center_button, R.id.right_button},
{R.id.bottom_left_button, R.id.bottom_center_button, R.id.bottom_right_button}};
在你的循环中,你可以像这样初始化新的i和j变量:
for (int i = 0; i < buttons.length; i++) {
for (int j = 0; j < buttons[i].length; j++) {
...
...
}
}
无需在活动的顶部声明它们。