处理:数组索引超出范围

时间:2013-02-11 03:06:13

标签: arrays processing indexoutofboundsexception

我是处理新手,我正在创建一个草图,其中600px x 600px画布中填充了来自orange[]调色板的50px随机颜色。块的随机形成需要位于draw()函数内部,以便使用稍后我将放入的一些条件正确操作。

我收到的错误是 ArrayIndexOutOfBoundsException:12 在这一行:

randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];

我似乎无法弄清楚为什么会出现这种错误。我已经研究了相关的问题,也许只是因为我是如此新鲜,但我无法弄清楚:

int x; //x coordinate
int y; //y coordinat
int s = 50; //rect size
int wide = 600; //canvas width
int tall = 600; //canvas height
int[] sIncrement = new int[12];//{s, s*2, s*3, s*4, s*5, s*6};

//colors
int[] oranges = {
  #773600, #5f3613, #552700, #9c5215, #9c5c26
};
int[] blues = {
  #004848, #0c3939, #003333, #107979, #1e7979
};
int[] palette = oranges;//holds current color pallete

//random
int fillColor = palette[int(random(0, palette.length))]; //random starting fill color
int changeColor = palette[int(random(0, palette.length))]; //random new color
int[] randomSize = new int[sIncrement.length]; //array of lots of random s values to place newly color changed blocks


//setup
void setup(){
  size(wide, tall);
  background(255);
  noStroke();
  frameRate(24);

  /*fills sIncrement array with incrementing s values (i.e. if s = 50 then array 
   contains 50, 100, 150, etc...) from 0 to canvas width for use in a conditional statement*/
  for(int i = 0; i <= sIncrement.length-1; i++){
    sIncrement[i] = s*i;
  }

 //creates multiple randomSize variables for if() x or y == randomSize[varCreator] 
 for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){
   randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];
 }
}

//draw
void draw(){
  fill(fillColor); //selects random color from palette

  //draws grid colored boxes with s size
  for (y = 0; y <= height; y+= s) {
    for (x = 0; x <= width; x+= s) {
      if(x == sIncrement[randomSize[1]] && y == sIncrement[randomSize[3]]){
        fill(changeColor); //selects random color from palette
        rect(x, y, s, s);
      }

      else{
      fill(fillColor);
     // fill(palette[int(random(0, palette.length))]); //selects random color from palette
      rect(x, y, s, s);
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

通过您的代码追踪您:

int[] sIncrement = new int[12];                    // sIncrement initialized with size 12
int[] randomSize = new int[sIncrement.length];     // randomSize initialized with size 12
for(... ; varCreator <= (width/s)+(height/s); ...) // varcreator <= 24!
randomSize[varCreator] = ...                       // Problem line

varcreator >= 12时,您将获得一个超出范围的数组索引异常。从那里开始修复你的代码。

答案 1 :(得分:1)

您正在访问数组randomSize的元素。这个阵列有多长?让我们看看它的声明:

int[] randomSize = new int[sIncrement.length];

因此,它与数组sIncrement的长度相同。如果我们看得更早一点:

int[] sIncrement = new int[12];

sIncrement的长度,因此randomSize的长度为12。

在此代码中:

for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){
    randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];
}

用于访问数组randomSize中元素的索引位于变量varCreator中,从0变为(width/s)+(height/s)。由于randomSize的长度为12,因此您只能使用0到11之间的索引来访问元素,否则您将报告错误。

所以,如果(width/s)+(height/s)不应该是12或更多。多少钱?

这就是我们陷入困境的地方,因为您的代码中没有任何内容告诉我们widthheight的声明位置。我们只知道s是50。

但是你有这些变量,widetall,每个等于600.我会猜测并估计代码中的某个地方width = wideheight = tall

所以(width/s)+(height/s) = (600/50) + (600/50) = 12 + 12 = 24

就是这样。 varCreator从0到24(包括在内),因此你用完了数组的边界。