Java System.arraycopy不会抛出ArrayIndexOutOfBoundsException

Java System.arraycopy不会抛出ArrayIndexOutOfBoundsException,java,arrays,indexoutofboundsexception,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)); 我的理解类似于“将1个元素从[0]开始的arr复制到[0]位置的copyArr”。这没关系。现在我将其更改为: String[] arr =

我不太明白System.arraycopy是如何工作的。举个简单的例子:

String[] arr = {"a"};
String[] copyArr = new String[10];
System.arraycopy(arr, 0, copyArr, 0, 1);
System.out.println(Arrays.toString(copy));
我的理解类似于“将1个元素从[0]开始的arr复制到[0]位置的copyArr”。这没关系。现在我将其更改为:

String[] arr = {"a"};
String[] copyArr = new String[10];
System.arraycopy(arr, 1, copyArr, 0, 0);
System.out.println(Arrays.toString(copy));
System.arraycopy(src, 2, dest, 0, 0);
由于arr.length是1,并且我们可以调用的唯一索引是[0],所以我希望它会抛出ArrayIndexOutOfBoundsException,但它没有

所以问题是下面这两行之间的区别是什么,为什么第一行是可能的,如果src中[1]没有元素(因为它的长度是1),这是本机方法,那么它是如何在内部实现的

System.arraycopy(src, 1, dest, 0, 0);
System.arraycopy(src, 0, dest, 0, 0);
当我们将其更改为:

String[] arr = {"a"};
String[] copyArr = new String[10];
System.arraycopy(arr, 1, copyArr, 0, 0);
System.out.println(Arrays.toString(copy));
System.arraycopy(src, 2, dest, 0, 0);

存在ArrayIndexOutOfBoundsException(文档中描述了这种情况,因为srcPos+length>src.length)。

src[1]
中有一个零长度数组,您可以“复制”。
src[2]
处没有零长度数组,因此引发异常

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


数组的开头和索引之间的每个位置也是如此。

src[1]
有一个零长度数组,您可以“复制”。
src[2]
处没有零长度数组,因此引发异常

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

数组的开头和索引之间的每个位置也是如此。

给你

从代码中可以清楚地看到:

// 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());
}
给你

从代码中可以清楚地看到:

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

如果您能详细阐述一下您的答案,那就太好了。谢谢,我只想补充一点,在arraycopy实现中,有一段代码类似于
if(length==0){return;}
它可以在linked by@FaigB中找到,并展示了它是如何在内部实现的如果你能详细说明你的答案就太好了谢谢,我只想补充一点,在arraycopy实现中,有一段代码看起来像这样
if(length==0){return;}
它可以在@FaigB链接中找到,并显示了它是如何在内部实现的,因为这就是文档所说的?或者你想知道它为什么这么说吗?因为这是文件上说的?或者你想知道它为什么这么说?