2015-06-18 100 views
0

我不知道這是怎麼發生的,也許我錯過了一些簡單的東西。索引超出界限,但不是?

我想如果有這樣的代碼存在,除去第一指數:

ArrayList<String> historyValues = new ArrayList<String>(); 
ArrayList<String> historyLabels = new ArrayList<String>(); 
some_big_process_which_populates_array() 
if(historyLabels.size() >= 1 && historyValues.size() >= 1){ 
    historyLabels.add("Not enough data yet"); 
    historyValues.add("0.0"); 
}else{ 
    Log.v("history_values", historyValues.toString()); 
    historyValues.remove(0); 
    historyLabels.remove(0); 
} 

和錯誤。空陣列如何通過size()檢查?

06-18 15:36:53.208 1510815108/com.rainforestautomation.android.energyvue V/history_values﹕ [] 
06-18 15:36:53.208 15108-15108/com.rainforestautomation.android.energyvue D/AndroidRuntime﹕ Shutting down VM 
06-18 15:36:53.209 15108-15108/com.rainforestautomation.android.energyvue E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.rainforestautomation.android.energyvue, PID: 15108 
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 

編輯:

看來我扭轉我的邏輯。

+1

你正試圖從一個空的列表中刪除的項目。 –

+1

'historyValues.remove(0);'如果你的'ArrayList'爲空則失敗。沒有魔術背後。 *「空數組如何超過size()檢查?」*它不在,它在'else'分支中,這意味着它無法檢查大小。 – Tom

回答

6

你比較反轉。

if(historyLabels.size() >= 1 && historyValues.size() >= 1){ 

應該

if(historyLabels.size() < 1 && historyValues.size() < 1){ 
+0

是的,謝謝,我覺得沒有立即看到它足夠愚蠢。 – John

0

historyValues.remove(0);

您刪除的第一個元素,但是你沒有的元素,如果你是else子句中(因爲>= 1失敗,這意味着該列表爲空)。

1

if(historyLabels.size() >= 1 && historyValues.size() >= 1) ==>一個空的集合將有大小爲0,因此不匹配> = 1。這就是爲什麼它去,你嘗試刪除一個空的集合的第一個元素else

0

如果大於1,則刪除索引。

因此,在其他情況下,它可能的大小爲0,ArrayList的空