Java:getRGB()方法说索引超出范围

时间:2016-05-08 23:01:11

标签: java

此代码的目的是提取turtle.jpg中每个像素的每个RGB值,但由于某种原因,它会使索引错误超出范围。寻求帮助,谢谢。

int j=1;
int i=1;
BufferedImage img=null; //declares image
try {
   File sx=new File("D:/turtle.jpg");
   img = ImageIO.read(sx);
   System.out.println("Reading complete.");
}
catch(IOException e)
{
   System.out.println("Error" + e);
}
for(i=1;i<225;i++);
{
   for(j=1;j<225;j++);
   {
      deh=new Color(img.getRGB(i, j));
      int r = deh.getRed();
      int g = deh.getGreen();
      int b = deh.getBlue();
      int a = deh.getAlpha();
      System.out.print(r + " " + g + " " + b + " " + a+" ");
   }
   System.out.println();
}
/*}
catch(IOException e){
   System.out.println("error");
}*/

3 个答案:

答案 0 :(得分:4)

充满鳗鱼的气垫船是绝对正确的。问题是你的循环变量的范围!如果你做过类似的事情:

class T {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) ; {
            for (int j = 0; j < 5; j ++) ; {
               System.out.println(i + ", " + j);
            }
        }
    }
}

您可以从编译器中获得以下内容:

T.java:5: error: cannot find symbol
               System.out.println(i + ", " + j);
                                  ^
  symbol:   variable i
  location: class T
T.java:5: error: cannot find symbol
               System.out.println(i + ", " + j);
                                             ^
  symbol:   variable j
  location: class T
2 errors

我重新学习的课程:尽可能地减少变量的范围是值得的(而不是更多)。

然而,像Intellij这样的好IDE会帮助发现一个完全难倒的错误(我知道这种感觉):

enter image description here enter image description here

答案 1 :(得分:2)

您的代码中存在一个明确的问题:

for(i=1;i<225;i++);    // <-- wrong semicolon!
{
   for(j=1;j<225;j++); // <-- wrong semicolon!
   {

分号基本上完成了for循环的主体,因此内部块在两个循环后执行,其中i==226j==226。删除两个分号。

答案 2 :(得分:0)

除了错误的分号外,不要使用魔术数字/任意数字作为最大像素,使用专用方法获取图像的高度和宽度,否则代码会很容易破解。