【Java原始碼】ArrayList原始碼(上)關於get方法的遺留問題
阿新 • • 發佈:2018-12-11
問題重現
在ArrayList原始碼的get方法中,傳參為負的異常是如何產生的? 原始碼只判斷了index > size
public E get(int index) { rangeCheck(index); return elementData(index); } private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } private String outOfBoundsMsg(int index) { return "Index: "+index+", Size: "+size; } @SuppressWarnings("unchecked") E elementData(int index) { return (E) elementData[index]; }
為了弄清楚這個問題,我發了個帖子,好在得到了完美的回答
在此鳴謝 使用者 Surrin1999
為了方便,現在將他的解釋拿過來看
授人以魚不如授人以漁 為了把這個問題講好 我們復現一次這個問題 測試程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
在第11行打一個斷點 然後進入debug(除錯)模式 然後點選單步跳入(注意不是單步跳過 不知道的話後面的圖會有提到) 顯然 你也知道rangeCheck只是檢測了index > size 那麼問題自然出在return這裡 繼續單步跳入
這個問題的產生也在於自己忽視了JVM本身的一些東西,只在意了程式碼方面的實現,忽視底層原理,要想把一個東西學好,其底層是沒辦法忽略的,受益匪淺,謝過大佬!