有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

复制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通道肯定存在于源文件中

编辑:永远不要把糟糕的编程可以充分解释的问题归咎于小故障。新代码让构造函数加载映像两次,而不是复制现有实例的数据。更干净,尽管我使用的是这里提供的javapnghttp://code.google.com/p/javapng/


共 (1) 个答案

  1. # 1 楼答案

    尝试在Sheet构造函数中将行更改为以下内容:

    currentSheet = new BufferedImage(defaultSheet.getWidth(), defaultSheet.getHeight(), defaultSheet.getType());