Java数组超出范围错误不是越界吗?
此代码是我的程序的相关部分,它会产生一个数组越界的错误,我不明白为什么。 我的错误是'java.lang.ArrayIndexOutOfBoundsException:6',其中6是随机值,位于randomShot()中的if语句中。Java数组超出范围错误不是越界吗?
public class Ai
{
private int WIDTH;
private int HEIGHT;
public Ai(){
WIDTH=10;
HEIGHT=10;
}
int[][] board=new int[WIDTH][HEIGHT];
Random rand = new Random();
public void randomShot(){
x=rand.nextInt(WIDTH/2);
y=rand.nextInt(HEIGHT);
x=x*2;
if(y%2==0)
{
y+=1;
}
if(board[x][y]!=0) //java.lang.ArrayIndexOutOfBoundsException: 6
{
randomShot();
}
}
我注意到,如果我使用的代码
int[][] board=new int[10][10];
它完美的罚款。我不明白为什么会发生这种情况,它是做同样的事情?
当您定义纸板时,WIDTH和HEIGHT为0。 构造函数在类级变量之后被调用。对于int,默认值为0.
谢谢,这完全滑了我的脑海。 – 2015-03-19 01:07:38
@JohnUnused一个upvote +接受的答案是去的方式:) – tinker 2015-03-19 01:08:48
我会上调亚,但我太新了,对不起:( – 2015-03-19 01:09:54
将board
初始化移动到构造函数中。字段初始化的顺序表示在构造函数进入之前声明(并初始化)数组(因此,WIDTH
和HEIGHT
为零)。
private int WIDTH;
private int HEIGHT;
public Ai(){
WIDTH=10;
HEIGHT=10;
board=new int[WIDTH][HEIGHT]; // <-- here.
}
int[][] board; // =new int[WIDTH][HEIGHT];
更好,移动'WIDTH'和'HEIGHT'的初始化*出* 'WIDTH'和'HEIGHT'应该是'static final'。 – EJP 2015-03-19 00:59:08
@EJP,你不能这样做,我有其他的构造函数可以设置WIDTH和HEIGHT为其他值,是的,我应该可以做他们是静态的决赛。 – 2015-03-19 01:04:09
谢谢!我看到我现在正在变笨! – 2015-03-19 01:07:17
按执行顺序阅读的时间。字段声明和初始化发生在调用构造函数之前。 – 2015-03-19 00:40:27