0

そのため、プログラムにキャッシュされた一連の画像のコピーを 2 つ保持しようとしています。両方の参照を保持するオブジェクトと、画像をロードしてその特定のクラスの新しいインスタンスに渡すループがあります。ただし、約 25 回目の反復で、クラスがコピーを作成するときに、Array Index Out of Bounds Exception が発生します。2番目のコピーで存在しないピクセルにコピーしようとしているか、最初のコピーの境界を超えていると推測しました。

コードの重要な部分は次のとおりです。

ループ:

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

最も奇妙な点は、2 番目の BufferedImage が最初のサイズで作成されることです。なぜ配列インデックスの例外が発生するのでしょうか?

編集:わかりましたので、切り替えBufferedImage.TYPE_INT_ARGBdefaultSheet.getType()エラーがなくなりました。問題は、以前にエラーが発生していたのと同じ画像が、ソース ファイルに確実に存在する赤およびアルファ チャネルなしでプログラム内に表示されることです。

編集:恐ろしいプログラミングによって適切に説明できるものをグリッチに帰することは決してありません. 新しいコードでは、既存のインスタンスのデータをコピーするのではなく、コンストラクターでイメージを 2 回読み込みます。javapngここで利用可能なライブラリを使用していますが、はるかにきれいですhttp://code.google.com/p/javapng/

4

1 に答える 1

0

Sheetコンストラクターで行を次のように変更してみてください。

currentSheet = new BufferedImage(defaultSheet.getWidth(), defaultSheet.getHeight(), defaultSheet.getType());
于 2012-07-17T03:50:23.053 に答える