【发布时间】:2012-07-17 13:56:44
【问题描述】:
所以我试图在我的程序中缓存一组图像的两个副本。我有一个包含两个引用的对象和一个加载图像并将它们传递给该特定类的新实例的循环。但是,大约在第 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/
【问题讨论】:
-
currentSheet = new BufferedImage(defaultSheet.getWidth(), defaultSheet.getHeight(), BufferedImage.TYPE_INT_ARGB);当前 (defaultSheet) 图片是什么图片类型? -
好吧,它是在循环中使用 ImageIO.read() 从 PNG 加载的,所以我假设为 ARGB。正如@cgull 在答案中提到的,我将 BufferedImage.TYPE_INT_ARGB 切换为 defaultSheet.getType()。但是,现在我发现我的程序只加载了一些图像的蓝色和绿色通道(是的,它们肯定有红色和 alpha 通道)。有什么想法吗?