我目前正试图让我的脑袋缠绕在imagej上,只是试图复制图像并吐出输出。一般的想法是获取图像,从图像处理器中取出像素阵列,将其复制到新阵列中,并从该阵列构建新图像。
现在在这里,aPixels_org [0]的值存在,您可以通过控制台输出看到。但即使我所有的支票,它仍然会抛出一个arrayoutofbounds异常。
这是代码......(顺便说一下l。只是一个记录器对象,只是一个健全性检查来检查数组值是否存在于下面的if条件中。建议是否有更好的方法,因为我是一个c ++的家伙,我习惯直接检查东西,因为java不允许if(int){}检查)
我从函数中获取aPixels_org,而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个值都以某种形式或另一种形式存在。我用Google搜索了错误,发现错误是
抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。
我错过了一些明显的东西吗?
RE
答案 0 :(得分:2)
两个数组 - aPixels_org
和aPixels_dup
- 的长度必须至少为iWidth*iHeight
(根据您的控制台输出,为217156)。一个(或两个)数组必须比它短,这就是你得到异常的原因。另外,请确保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("");
答案 1 :(得分:0)
全部在JavaDoc。 我突出显示我认为是导致错误的原因。
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
...
否则,如果满足以下任何条件,则抛出IndexOutOfBoundsException
并且不修改目标:
srcPos
参数为否定。destPos
参数为否定。length
参数为否定。srcPos+length
大于src.length
,源数组的长度。 destPos+length
大于dest.length
,即目标数组的长度。