我正在阅读System.arraycopy
的{{3}},发现有些事让我困惑。
...如果满足以下任何条件,则抛出
IndexOutOfBoundsException
并且不修改目的地:
srcPos
参数为负数。destPos
参数为负数。length
参数为负数。srcPos+length
大于src.length
,即源数组的长度。destPos+length
大于dest.length
,即目标数组的长度。
在throws
的陈述中,它说
IndexOutOfBoundsException - 如果复制会导致访问数组边界外的数据。
我在想......
为什么他们使用IndexOutOfBoundsException但不使用ArrayIndexOutOfBoundsException?
我尝试了上面提到的所有情况,并且实际上都抛出了ArrayIndexOutOfBoundsException
那么有什么理由可以避免在JavaDoc中使用IndexOutOfBoundsException的子类吗?
答案 0 :(得分:1)
您似乎已经知道,IndexOutOfBoundsException
是ArrayIndexOutOfBoundsException
的父类。我认为通过返回更通用的异常类型,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块中使用IndexOutOfBoundsException
比ArrayIndexOutOfBoundsException
更多,这样可以很容易地从System.arrayCopy()
捕获异常,但也可以更容易在捕获时更具体例外。