ArrayIndexOutOfBoundsException与合法索引、java、imagej

ArrayIndexOutOfBoundsException与合法索引、java、imagej,java,imagej,Java,Imagej,我现在正试着让我的头缠绕在imagej上,只是试着复制一个图像并输出。总体思路是获取图像,从图像处理器中取出像素阵列,将其复制到新阵列中,然后从该阵列构建新图像 在这里,aPixels_org[0]的值存在,您可以从控制台输出中看到。但它仍然抛出一个边界数组例外,即使我所有的支票 这是代码。。。(BTW L只是一个日志对象,只是一个健全的检查,检查数组值是否存在于IF条件下。请建议是否有更好的方式,因为我是C++的家伙,并且习惯于直接检查数据,因为java不允许IF(int){}检查) 我从一个

我现在正试着让我的头缠绕在imagej上,只是试着复制一个图像并输出。总体思路是获取图像,从图像处理器中取出像素阵列,将其复制到新阵列中,然后从该阵列构建新图像

在这里,aPixels_org[0]的值存在,您可以从控制台输出中看到。但它仍然抛出一个边界数组例外,即使我所有的支票

这是代码。。。(BTW L只是一个日志对象,只是一个健全的检查,检查数组值是否存在于IF条件下。请建议是否有更好的方式,因为我是C++的家伙,并且习惯于直接检查数据,因为java不允许IF(int){}检查)

我从一个函数中获取aPixels\u org,一个数据aPixels\u 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

两个数组-
aPixels\u org
aPixels\u dup
必须至少具有
iWidth*iHeight
(根据控制台输出,长度为217156)。其中一个(或两个)数组必须比该数组短,这就是为什么会出现异常。还要确保
iWidth*iHeight
的值在分配
aPixels\u dup
和调用
System.arraycopy
之间没有增加

使用
Math.min(aPixels\u org.length,aPixels\u dup.length)
作为
System.arraycopy
的最后一个参数会更安全。但是,这将隐藏代码中的任何长度错误。您可能希望
断言两个数组都具有预期的长度

而且,你的支票似乎毫无意义。两个数组中都存在索引为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("");
都在里面。我强调了我认为是你犯错误的原因

否则,如果以下任一项为真,则会引发
IndexOutOfBoundsException
,并且不会修改目标:

  • srcPos
    参数为负
  • destPos
    参数为负
  • length
    参数为负数
  • srcPos+length
    大于源数组的长度
    src.length
  • destPos+length
    大于目标数组的长度
    dest.length

Dup已分配-源阵列必须也是short@Bohemian-除非
iWidth
iHeight
的值在分配和调用
System.arraycopy
之间上升。图像是否有多帧?如果是这样,您应该为数组设置iWidthHeightInOfFramelength@medPhys-pl-很好。实际上,为了复制数据,只使用数组长度就足够了,忽略
iWidth
iHeight
的值。允许您执行更复杂的操作是一个很好的练习,但如果您只想创建图像的副本,请调用“ImageProcessor.duplicate()”
 public static void arraycopy(Object src,
             int srcPos,
             Object dest,
             int destPos,
             int length)
 ...