所以我试图在我的程序中缓存一组图像的两个副本。我有一个包含两个引用的对象和一个加载图像并将它们传递给该特定类的新实例的循环。但是,大约在第 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
最奇怪的是第二个 BufferedImage 是用第一个的大小创建的,那么为什么我们会得到一个数组索引异常呢?
编辑:好的,所以我切换BufferedImage.TYPE_INT_ARGB
到defaultSheet.getType()
并且错误消失了。现在的问题是,之前给我错误的相同图像现在显示在程序中,而没有源文件中肯定存在的红色和 alpha 通道。
编辑:永远不要将故障归因于可怕的编程可以充分解释的故障。新代码让构造函数加载图像两次,而不是复制现有实例的数据。更干净,虽然我使用javapng
这里提供的库http://code.google.com/p/javapng/