是否存在System.arraycopy抛出IndexOutOfBoundsException的情况?

时间:2016-12-23 08:17:37

标签: java indexoutofboundsexception

我正在阅读System.arraycopy的{​​{3}},发现有些事让我困惑。

  

...如果满足以下任何条件,则抛出IndexOutOfBoundsException并且不修改目的地:

     
      
  • srcPos参数为负数。
  •   
  • destPos参数为负数。
  •   
  • length参数为负数。
  •   
  • srcPos+length大于src.length,即源数组的长度。
  •   
  • destPos+length大于dest.length,即目标数组的长度。
  •   

throws的陈述中,它说

  

IndexOutOfBoundsException - 如果复制会导致访问数组边界外的数据。

我在想...... 为什么他们使用IndexOutOfBoundsException但不使用ArrayIndexOutOfBoundsException?
我尝试了上面提到的所有情况,并且实际上都抛出了ArrayIndexOutOfBoundsException 那么有什么理由可以避免在JavaDoc中使用IndexOutOfBoundsException的子类吗?

2 个答案:

答案 0 :(得分:1)

您似乎已经知道,IndexOutOfBoundsExceptionArrayIndexOutOfBoundsException的父类。我认为通过返回更通用的异常类型,Java可以使其System.arraycopy() API更加灵活。假设将来System.arraycopy()抛出另一种类型的索引边界异常。如果API使用刚性ArrayIndexOutOfBoundsException,则使用该方法的任何人都可能必须重构其代码。另一方面,通过使用IndexOutOfBoundsException,代码保持灵活性,并且可以轻松处理新类型的异常。

总而言之,我会说Java是出于良好的设计实践而做到的。

答案 1 :(得分:1)

来自javadoc:

  • ArrayIndexOutOfBoundsException

      

    抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。

  • IndexOutOfBoundsException

      

    抛出以指示某种索引(例如数组,字符串或向量)超出范围。

任何索引超出范围时会抛出IndexOutOfBoundsException,而当数组索引超出范围时会抛出ArrayIndexOutOfBoundsException

通过抛出ArrayIndexOutOfBoundsException,他们很清楚索引是什么 - 它特别是一个数组索引。如果他们抛出IndexOutOfBoundsException,则可以引用任何索引。

Tl;博士:他们更具体,更清晰。

至于为什么文档说它会抛出IndexOutOfBoundsException,但实际上会抛出ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException确实从IndexOutOfBoundsException延伸,因此可以将它们归类为IndexOutOfBoundsException,并且更容易简单地引用超类,但最终会抛出ArrayIndexOutOfBoundsException,因为它更精确。您还可以在try / catch块中使用IndexOutOfBoundsExceptionArrayIndexOutOfBoundsException更多,这样可以很容易地从System.arrayCopy()捕获异常,但也可以更容易在捕获时更具体例外。