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]; 

它完美的罚款。我不明白为什么会发生这种情况,它是做同样的事情?

+2

按执行顺序阅读的时间。字段声明和初始化发生在调用构造函数之前。 – 2015-03-19 00:40:27

当您定义纸板时,WIDTH和HEIGHT为0。 构造函数在类级变量之后被调用。对于int,默认值为0.

+0

谢谢,这完全滑了我的脑海。 – 2015-03-19 01:07:38

+0

@JohnUnused一个upvote +接受的答案是去的方式:) – tinker 2015-03-19 01:08:48

+0

我会上调亚,但我太新了,对不起:( – 2015-03-19 01:09:54

board初始化移动到构造函数中。字段初始化的顺序表示在构造函数进入之前声明(并初始化)数组(因此,WIDTHHEIGHT为零)。

private int WIDTH; 
private int HEIGHT; 

public Ai(){ 
    WIDTH=10; 
    HEIGHT=10; 
    board=new int[WIDTH][HEIGHT]; // <-- here.   
} 

int[][] board; // =new int[WIDTH][HEIGHT]; 
+0

更好,移动'WIDTH'和'HEIGHT'的初始化*出* 'WIDTH'和'HEIGHT'应该是'static final'。 – EJP 2015-03-19 00:59:08

+0

@EJP,你不能这样做,我有其他的构造函数可以设置WIDTH和HEIGHT为其他值,是的,我应该可以做他们是静态的决赛。 – 2015-03-19 01:04:09

+0

谢谢!我看到我现在正在变笨! – 2015-03-19 01:07:17