正确分配内存后,Java代码会出错

时间:2013-06-08 08:58:05

标签: java memory-management

我正在尝试打印每个像素的值,但在p = 300时会出错。 在p = 300之前,会打印所有像素。

orignal.getHeight() = 344;orignal.getWidth() = 300;

BufferedImage binarized = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());
int p, q;

System.out.println(original.getHeight() + "," + original.getWidth());

for(p=0;p<original.getHeight();p++)
{
    for(q = 0; q < original.getWidth(); q++)
    {
        //System.out.println("goint to get pixel"+"("+p+","+q+")");
        int Pixel = binarized.getRGB(p, q);
    }
}

错误讯息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
    at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)
    at java.awt.image.BufferedImage.getRGB(BufferedImage.java:888)
    at Binarization.binarize(Binarization.java:137)
        at Binarization.main(Binarization.java:20)

这是某种内存分配问题吗?

2 个答案:

答案 0 :(得分:7)

不,这意味着您的逻辑中存在错误。

您尝试按索引访问数组元素,该元素大于数组大小

尝试更改数组检索的逻辑:

 int Pixel=binarized.getRGB(q,p);

这是有效的,因为该方法需要:getRGB(int width,int height),但是你提供高度,宽度

答案 1 :(得分:3)

查看BufferedImage.getRGB

的文档
public int getRGB(int x, int y)

请注意,x值是第一个参数 - 应该在[0,width]范围内的y值是第二个参数 - 即应该在[0,height]范围内的参数。你错了路。不可否认,我对此例外并不友好感到有些失望。

如果您在循环中使用xy变量,那就更清楚了:

for (int y = 0; y < original.getHeight(); y++)
{                   
    for (int x = 0; x < original.getWidth(); x++)
    {                   
        int pixel = binarized.getRGB(x, y);
        // Use pixel
    }                   
} 

(另请注意我如何在循环中声明xy;事先声明它们是没有意义的。我还添加了空格以便于阅读。)