复制BuffereImage时出现java数组索引错误
所以我试图在我的程序中缓存一组图像的两个副本。我有一个对象,其中包含两个引用,还有一个循环,用于加载图像并将其传递给该特定类的新实例。然而,在大约第25次迭代中,当类进行复制时,我得到了一个数组索引越界异常。我推断,它要么试图复制到第二个副本中不存在的像素,要么超出了第一个副本的边界
以下是代码中重要的部分:
循环:
Hashtable<String, Sheet> tempHashTable = new Hashtable<String, Sheet>();
for(int ii = 0; ii < sheetNames.size(); ii++) {
try {
File tempSheetFile = new File(Constants.TEMP_DIR, sheetNames.get(ii));
BufferedImage tempSheet = ImageIO.read(tempSheetFile);
System.out.println(sheetNames.get(ii));
tempHashTable.put(sheetNames.get(ii), new Sheet(tempSheet));
} catch (IOException ex) {
}
}
工作表初始化:
private BufferedImage defaultSheet;
private BufferedImage currentSheet;
public Sheet(BufferedImage defaultSheet) {
this.defaultSheet = defaultSheet;
currentSheet = new BufferedImage(defaultSheet.getWidth(), defaultSheet.getHeight(), BufferedImage.TYPE_INT_ARGB);
currentSheet.setData(defaultSheet.getData()); //Error line
}
错误:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 64
最奇怪的是,第二个BuffereImage是以第一个的大小创建的,那么为什么我们会得到数组索引异常呢
编辑:好的,所以我把BufferedImage.TYPE_INT_ARGB
切换到了defaultSheet.getType()
,错误消失了。现在的问题是,之前给我错误信息的图像现在显示在程序中,但它们的红色和alpha通道肯定存在于源文件中
编辑:永远不要把糟糕的编程可以充分解释的问题归咎于小故障。新代码让构造函数加载映像两次,而不是复制现有实例的数据。更干净,尽管我使用的是这里提供的javapng
库http://code.google.com/p/javapng/
# 1 楼答案
尝试在
Sheet
构造函数中将行更改为以下内容: