2013-03-22 19 views
1

我有兩個的ArrayList:有沒有比使用ArrayList更好的方法,所以我沒有得到IndexOutOfBounds異常?

ArrayList<String> libraries = new ArrayList<String>(2); 
ArrayList<String> styles = new ArrayList<String>(2); 

我有3個複選框組件。三個複選框應該向ArrayList添加或刪除字符串,但是當jqMobileChk被選中時會發生IndexOutOfBoundsException。

的三個複選框:

jqChk.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if(jqChk.isChecked()){ 
      libraries.add(0,"<script src=\"http://code.jquery.com/jquery-1.8.2.min.js\"></script>\n"); 
     }else if(!jqChk.isChecked()){ 
      libraries.remove(0); 
     } 
    } 
}); 

jqMobileChk.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if(jqMobileChk.isChecked()){ 
      libraries.add(1,"<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n"); 
     }else if(!jqMobileChk.isChecked()){ 
      libraries.remove(1); 
     } 
    } 
}); 

jqMobCSS.setOnClickListener(new OnClickListener() {  
    @Override 
    public void onClick(View v) { 
     if(jqMobCSS.isChecked()){ 
      styles.add(0,"<link rel=\"stylesheet\" href=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css\" />\n"); 
     }else if(!jqMobCSS.isChecked()){ 
      styles.remove(0); 
     } 
    } 
}); 
+9

'新的ArrayList(2)'不*不*創建2種元素的ArrayList。它最初是空的 - 這是「內部」容量。同樣,'add/remove' *改變ArrayList的大小*。 ArrayList!=數組。 – 2013-03-22 23:18:04

+0

不確定爲什麼這個問題被認爲不可能幫助未來的訪問者。我發現答案非常有用,並且可能會幫助其他人討論ArrayList的缺陷。瞭解Map對象類型也很重要。 +1花時間來解釋每個人的事情。 – RapsFan1981 2013-03-23 16:19:59

+0

調試。這在編程中非常重要。 IndexOutOfBounds,NullReferenceException等等。這些都是由非常特殊的條件引起的。附上一個調試器,並看看。 *開發人員的工作是隔離出現這些問題的條件以解決問題。*現在,看看標題 - 是否真的會幫助任何人?不。現在,如果問題在*最小測試用例*中被隔離*,那麼也許。因爲它現在是..不。 – 2013-03-23 19:16:51

回答

4

的幾個問題:

  • 不要用具體的類型爲類型簽名;請使用界面,以便您可以稍後切換實施。因此,使用List<String> libraries = ...而不是ArrayList<String> libraries = ...
  • 創建List2作爲構造函數的參數只爲空間兩個元素創建一個列表。這並不意味着它包含兩個元素。當你做libraries.remove(1)時,你正在刪除一些甚至不存在的東西。
  • 而不是使用一個List<String>在這裏,我想一個Map<Integer, String>可能會更好:

而不是做add(0, "..."),你會做libraries.put(0, "...");。要刪除,您可以執行libraries.remove(0)。如果密鑰不存在,您將不會收到異常。例如:

jqMobileChk.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     if(jqMobileChk.isChecked()) { 
      libraryMap.put(0, "<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n"); 

     } else if(!jqMobileChk.isChecked()) { 
      libraryMap.remove(0); 
     } 
    } 
}); 

而且,而不只是01,它可能是最好使用實際的版本號,所以1.3.0而不是0。在這種情況下,你想使你的地圖爲Map<String, String>並執行以下操作:

jqMobileChk.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     if(jqMobileChk.isChecked()) { 

      libraryMap.put("1.3.0","<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n"); 

     } else if(!jqMobileChk.isChecked()) { 
      libraryMap.remove("1.3.0"); 
     } 
    } 
}); 
4
ArrayList<String> libraries = new ArrayList<String>(2); 

容量2,大小0

libraries.remove(1); 

OFC idnex出界,因爲大小爲0

+1

我有一種感覺,經過一系列的選擇變更後,這將工作不可預測.. – 2013-03-22 23:20:35

+0

是的,像這樣的列表工作是不可預知和容易出錯。一個'地圖'會更好。 – 2013-03-22 23:27:57

1

您不能添加到索引1如果ArrayList中沒有索引0。

改爲使用「真實」陣列或SparseArray - 您可以這樣做。

2

ArrayList.add

拋出:
IndexOutOfBoundsException - 如果索引超出範圍(index < 0 || index> size())

ArrayList沒有元素,因此例外。

您可以使用Map代替

Map<String, String> libraries = new HashMap<String, String>(); 

然後

jqMobileChk.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (jqMobileChk.isChecked()) { 
      libraries.put("jqMobileChk","<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n"); 
     } else if (!jqMobileChk.isChecked()) { 
      libraries.remove("jqMobileChk"); 
     } 
    } 
}); 
+0

從來不知道地圖。謝謝! – RapsFan1981 2013-03-22 23:59:03

相關問題