0

私は現在、頭をimagejに巻き付けようとしており、画像を複製して出力を吐き出そうとしています。一般的な考え方は、画像を取得し、画像プロセッサからピクセル配列を取得し、それを新しい配列にコピーして、その配列から新しい画像を構築することです。

これで、コンソール出力からわかるように、aPixels_org[0] の値が存在します。しかし、すべてのチェックを行っても、arrayoutofbounds 例外がスローされます。

これがコードです...(ところで、l.は単なるロガーオブジェクトであり、以下のif条件に配列値が存在するかどうかを確認するためのサニティチェックです。私はC ++の人なので、より良い方法があるかどうかアドバイスしてください、そしてJavaがif(int){}チェックを許可しないため、直接チェックすることに慣れています)

関数からaPixels_orgを取得しています.dthe aPixels_dupはそのように作成されています

int[] aPixels_dup = new int[iWidth*iHeight];

ここで、iWidth*iHeight は必要な配列のサイズです。また、array.length() オプションを使用してサイズを直接生成しようとしました。問題のコードは

System.out.println(">>>>>>>>>>>>>>>>>>>>>." + aPixels_dup[0] +"  " + aPixels_org[0] + "  " + iWidth + "  " + iHeight);
    if(Integer.toString(aPixels_org[0]) != null &&  Integer.toString(aPixels_dup[0]) != null )
    {
        l.info("Arrays exsist");
        System.arraycopy(aPixels_org,0,aPixels_dup,0,iWidth*iHeight);
        l.info("Array Copied");
    }
    else{l.warn("Something is NULL");}
    l.info("");

これがエラーです

java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at Alpha_.DuplicateCurrentImage(Alpha_.java:64)
at Alpha_.run(Alpha_.java:81)
at ij.IJ.runUserPlugIn(IJ.java:185)
at ij.IJ.runPlugIn(IJ.java:152)
at ij.Executer.runCommand(Executer.java:127)
at ij.Executer.run(Executer.java:64)
at java.lang.Thread.run(Thread.java:679)

ここにコンソール出力があります

[INFO] % FILE: Alpha_.java % CLASS: Alpha_ % FUNCTION: DuplicateCurrentImage % LINE: 59    % COMMENT: OK % % % TIMESTAMP: 2013-01-17 00:26:55,942
 0  -1393202  466  466
[INFO] % FILE: Alpha_.java % CLASS: Alpha_ % FUNCTION: DuplicateCurrentImage % LINE: 63 % COMMENT: Arrays exsist % % % TIMESTAMP: 2013-01-17 00:26:55,942

これで私の出力は終わりです。プログラムは上記のエラーでクラッシュします。ご覧のとおり、4 つの値はすべて何らかの形で存在します。エラーをグーグルで調べたところ、エラーが

配列が不正なインデックスでアクセスされたことを示すためにスローされます。インデックスが負であるか、配列のサイズ以上です。

ここで明らかな何かが欠けていますか?

RE

4

2 に答える 2

2

両方の配列 —aPixels_orgおよびaPixels_dup— は、少なくとも長さが必要iWidth*iHeightです (コンソール出力によると、これは 217156 です)。配列の 1 つ (または両方) はそれより短くする必要があるため、例外が発生します。またiWidth*iHeight、 の割り当てaPixels_dupと の呼び出しの間に の値が増加していないことを確認してSystem.arraycopyください。

Math.min(aPixels_org.length, aPixels_dup.length)の最後の引数として使用する方が安全System.arraycopyです。ただし、それではコード内の長さエラーが隠されます。assert両方の配列が期待される長さであることを望むかもしれません。

また、あなたの小切手は無意味なようです。インデックス 0 の要素が両方の配列に存在するという事実は、ちょっと関係ありません。また、Integer.toString(int)決して返しませんnull。適切なチェックを行うコードのバージョンを次に示します。

if (aPixels_org != null &&
    aPixels_dup != null &&
    aPixels_org.length == aPixels_dup.length &&
    aPixels_org.length == iWidth*iHeight )
{
    l.info("Array sizes match");
    System.arraycopy(aPixels_org,0,aPixels_dup,0,iWidth*iHeight);
    l.info("Array Copied");
}
else{l.warn("Something is NULL or dimensions are off");}
l.info("");
于 2013-01-17T00:50:07.393 に答える
0

それはすべてJavaDocにあります。エラーの原因と思われる理由強調しました。

 public static void arraycopy(Object src,
             int srcPos,
             Object dest,
             int destPos,
             int length)
 ...

それ以外の場合、次のいずれかが true の場合、IndexOutOfBoundsExceptionがスローされ、宛先は変更されません。

  • srcPos引数は否定的です。
  • destPos引数は否定的です。
  • length引数は否定的です。
  • srcPos+lengthsrc.lengthは、ソース配列の長さより大きいです。
  • destPos+lengthdest.lengthは、宛先配列の長さより大きいです。
于 2013-01-17T00:50:44.450 に答える