2017-06-21 47 views
2

如果我們創建一個虛擬ArrayList像下面並調用get-11作爲參數。然後,我們得到以下outputArrayIndexOutOfBoundException VS IndexOutOfBoundException

  • 測試用例1:它拋出ArrayIndexOutOfBoundException

  • 測試用例2:拋出IndexOutOfBoundException

    List list = new ArrayList(); 
    list.get(-1); //Test Case 1 
    list.get(1); // Test Case 2 
    

請解釋爲什麼會出現這兩者之間的區別?

+0

一個非常明顯的區別是'-1'永遠不會是一個有效的索引,而'1'將是(如果一個列表至少有兩個條目)。 –

+0

* ArrayIndexOutOfBoundException *是** IndexOutOfBoundException的子類** - 最重要的一點。另一個子類是* StringIndexOutOfBoundsException *。 –

回答

6

這是ArrayList的實施細節。

ArrayList由數組支持。對具有負索引的數組的訪問會拋出ArrayIndexOutOfBoundsException,因此不必通過ArrayList類的代碼進行明確測試。

在另一方面,如果用非負折射率是的範圍外訪問ArrayListArrayList(即> =的ArrayList的大小),特定的檢查,在下面的方法中,進行這拋出IndexOutOfBoundsException

/** 
* Checks if the given index is in range. If not, throws an appropriate 
* runtime exception. This method does *not* check if the index is 
* negative: It is always used immediately prior to an array access, 
* which throws an ArrayIndexOutOfBoundsException if index is negative. 
*/ 
private void rangeCheck(int index) { 
    if (index >= size) 
     throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 
} 

這檢查是必要的,因爲所提供的索引可以是背襯陣列的有效索引(如果它比ArrayList的電流容量較小),所以訪問與索引背襯陣列> = ArrayList的大小不一定會拋出異常。

ArrayIndexOutOfBoundsException是子類的IndexOutOfBoundsException,這意味着它是正確的說ArrayListget方法對於這兩個負指數拋出IndexOutOfBoundsException和指數> =列表的大小。

注意,不像ArrayListLinkedList拋出IndexOutOfBoundsException爲負和非負的指標,因爲它不是由數組支持,因此它不能依賴於一個陣列上扔負指數異常:

private void checkElementIndex(int index) { 
    if (!isElementIndex(index)) 
     throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 
} 

/** 
* Tells if the argument is the index of an existing element. 
*/ 
private boolean isElementIndex(int index) { 
    return index >= 0 && index < size; 
} 
+0

@ Eran-爵士Java文檔說,如果索引小於0或大於或等於列表的大小,將會導致IndexOutOfBoundException。 –

+2

@Animal Javadoc說的是實話,因爲'ArrayIndexOutOfBoundsException'是'IndexOutOfBoundException'的子類。 – Eran

+0

Ohhhh ...非常感謝... :) –

相關問題