下面這個代碼輸出是什麼?
A. 運行時異常
B. 正確運行,輸出str1
C. 正確運行,輸出str2
D. 編譯時出現異常
答案:A
答案中首先排除D選項,代碼是編譯肯定是通過的。其他的先上機操作驗真僞:
的確是運行時異常。
我們看下報錯的行數第51行。爲什麼是這行報錯?上源碼:
這個是List類接口定義的源碼,看方法上的註釋最後一行。if the index is out of range(如果傳入的index參數值小於0或者大於size)拋出IndexOutOfBoundsException。
下面再來看看ArrayList對此接口的實現:
方法第一行調用rangeCheckForAdd()方法,對List進行校驗,接着看此方法:
這裏看出來了就是我們上面說的:如果傳入的index參數值小於0或者大於size,拋出異常。
我們再來看看爲什麼報錯提示的是當前size爲1?
這裏要先看ArrayList的初始化List<String> list = new ArrayList();
ArrayList裏面有三種構造函數:
- 無參構造
- 傳入整數
- 傳入集合
以上三個構造函數初始化時都用到了類裏面定義的常量,我們先看下定義的常量再來解釋這三個構造函數
第一個常量就是聲明一個靜態常量,第二三個都是定義的一個空數組,但是這個是有區別的,第二個就是單純的一個空數組,而第三個定義的空數組,是隨着元素的插入,自動增加大小。第四個聲明一個數組,第五個聲明數組大小。
現在我們再轉過去看第一個構造函數,無參構造函數。當初始化List的時候,elementData被賦值DEFAULTCAPACITY_EMPTY_ELEMENTDATA,這個數組最開始就是空的,當執行list.add("str1")的時候,數組size+1,然後插入數據。如下圖:
結合最上面的源碼,這樣就能解釋爲什麼第51行執行的時候會報錯了(即運行時報錯)。。。
ps. 有參構造,我下一篇在進行解讀。