System.arraycopy 不抛出 ArrayIndexOutOfBoundsException
Posted
技术标签:
【中文标题】System.arraycopy 不抛出 ArrayIndexOutOfBoundsException【英文标题】:System.arraycopy does not throw ArrayIndexOutOfBoundsException 【发布时间】:2016-11-03 12:18:45 【问题描述】:我不完全了解 System.arraycopy 的工作原理。举个简单的例子:
String[] arr = "a";
String[] copyArr = new String[10];
System.arraycopy(arr, 0, copyArr, 0, 1);
System.out.println(Arrays.toString(copy));
我理解它就像“从 [0] 开始的 arr 复制 1 个元素到 copyArr 到位置 [0]”。这没关系。现在我把它改成:
String[] arr = "a";
String[] copyArr = new String[10];
System.arraycopy(arr, 1, copyArr, 0, 0);
System.out.println(Arrays.toString(copy));
由于 arr.length 是 1,我们可以调用的唯一索引是 [0] 我预计它会抛出 ArrayIndexOutOfBoundsException 但它不会。
所以问题是下面这两行之间有什么区别,如果 src 中的 [1] 处没有元素(因为它的长度为 1),为什么第一行是可能的,这是本机方法,所以它是内部实现?
System.arraycopy(src, 1, dest, 0, 0);
System.arraycopy(src, 0, dest, 0, 0);
当我们把它改为:
System.arraycopy(src, 2, dest, 0, 0);
存在 ArrayIndexOutOfBoundsException(这种情况在文档中进行了描述,因为 srcPos+length > src.length)。
【问题讨论】:
因为这是文档所说的?或者你想知道为什么它这么说吗? 【参考方案1】:src[1]
有一个长度为零的数组,您可以“复制”它。 src[2]
处没有长度为零的数组,因此会引发异常。
想象一个大小为 3 的数组,以及它包含的子数组(显示子数组大小):
[ 0 ][ 1 ][ 2 ]
[ -----3------]
[----2---]
[-1-]
[]
同样适用于数组的开头,以及索引之间的每个位置。
【讨论】:
如果你能详细说明你的答案就好了 谢谢,我只想补充一点,在 arraycopy 实现中有一段代码看起来像这样if (length==0) return;
,它可以在@FaigB 链接的question 中找到并显示它是如何内部实现【参考方案2】:
你是topic
从代码中可以看出:
// Check if the ranges are valid
if ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length())
|| (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) )
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
【讨论】:
以上是关于System.arraycopy 不抛出 ArrayIndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章