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的主要内容,如果未能解决你的问题,请参考以下文章

为啥设置 DataSource 时 ComboBox 不抛出异常?

为啥 JPA 重复持久方法不抛出异常?

VBScript 上的错误处理:不抛出错误

为啥不抛出异常的代码允许捕获已检查的异常?

回滚而不抛出异常?

JDBC 超时不抛出 SQLTimeoutException