我调用ImageIO.read(path);方法读取一张分辨率为宽:27919 高:28386的jpg图片,运行中抛出如下异常。第一眼以为是图片尺寸过大,超过了整型最大值。可是简单计算之后发现,整型最大值0x7fffffff(2147483647)比我这个图片的宽高的乘积大得多。
java.lang.IllegalArgumentException: Array size > Integer.MAX_VALUE!
at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1064)
at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1046)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1014)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
jdk相关的源代码如下,我根据这样的写法单独写了个简单的测试程序。
public SampleModel getSampleModel(int width, int height) {
if ((long)width*height > Integer.MAX_VALUE) {
throw new IllegalArgumentException
("width*height > Integer.MAX_VALUE!");
}
return sampleModel.createCompatibleSampleModel(width, height);
}
测试程序如下。结果也是smaller,真是搞不懂啊! 求大神指点啊!!!!
private static void test(int width,int height){
if ((long)width*height > Integer.MAX_VALUE) {
System.out.println("bigger!");
}
else{
System.out.println("smaller!");
}
}
public static void main(String[] args) {
int a = 27919;
int b = 28386;
test(a,b);
}
mageTypeSpecifier.java:1064 你看下这个类的1064行,java.lang.IllegalArgumentException: Array size > Integer.MAX_VALUE! 异常是说这个,数组的大小超过了Integer的最大值,你好好看下
我已经跟踪调试到了抛出异常的代码段,就是下面这段。我也查看了传入的变量width和height,就是图片的分辨率27919和28386,
但是明显这2个数的乘积的结果不满足判断条件,居然还是抛出异常,实在是诡异!
if ((long)width*height > Integer.MAX_VALUE) {
throw new IllegalArgumentException
("width*height > Integer.MAX_VALUE!");
}
参数不合法,你打印一下 width, height是什么
搞错了。找到真正出错的地方了。在下面这个函数中发现scanlineStride是83757,非常大。乘以height之后会超过整型最大值。
private long getBufferSize() {
int maxBandOff=bandOffsets[0];
for (int i=1; i<bandOffsets.length; i++)
maxBandOff = Math.max(maxBandOff,bandOffsets[i]);
long size = 0;
if (maxBandOff >= 0)
size += maxBandOff+1;
if (pixelStride > 0)
size += pixelStride * (width-1);
if (scanlineStride > 0)
size += scanlineStride*(height-1);
return size;
}
而之后,int size = (int)getBufferSize(); 又把这个超过整型最大值的数强制转换为整型,造成size成了一个负数。最后拿个size来创建缓存区的时候
抛出了异常。dataBuffer = new DataBufferByte(size, numBanks);
看样子还是图片太大了。真悲剧!
width*height > Integer.MAX_VALUE!
Array size > Integer.MAX_VALUE!
这不是一个错误吧