System.arraycopy不会抛出ArrayIndexOutOfBoundsException

时间:2016-11-03 12:18:45

标签: java arrays indexoutofboundsexception

我不完全了解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到位置[0]的复制1元素”。这没关系。现在我将其更改为:

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)。

2 个答案:

答案 0 :(得分:2)

src[1]处有一个零长度数组,您可以“复制”。 <{1}}没有零长度数组,因此会抛出异常。

想象一个大小为3的数组,以及它包含的子数组(显示的子数组大小):

src[2]

Ditto表示数组的开头,以及索引之间的每个位置。

答案 1 :(得分:1)

您在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());
}