有没有比使用ArrayList更好的方法,所以我没有得到IndexOutOfBounds异常?

时间:2013-03-22 23:16:31

标签: java android arraylist

我有两个ArrayLists:

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

我有3个CheckBox组件。三个CheckBoxes应该向ArrayList添加或删除字符串,但是当选中 jqMobileChk 时会发生IndexOutOfBoundsException。

三个CheckBoxes:

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);
        }
    }
});

4 个答案:

答案 0 :(得分:4)

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

容量2,尺寸0

   libraries.remove(1);

ofc index超出界限,因为size是0

答案 1 :(得分:4)

一些问题:

  • 不要使用具体类型作为类型签名;请改用接口,以便以后可以根据需要切换实现。因此,请使用List<String> libraries = ...代替ArrayList<String> libraries = ...
  • 使用List创建2作为构造函数的参数,只为两个元素创建一个包含 room 的列表。这并不意味着它包含两个元素。执行libraries.remove(1)时,您将删除一些甚至不存在的内容。
  • 我认为List<String>可能更好,而不是在Map<Integer, String>使用{<1}}:

不是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");
        }
    }
});

答案 2 :(得分:2)

来自ArrayList.add

  

<强>抛出:
      IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; 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");
        }
    }
});

答案 3 :(得分:1)

如果ArrayList中没有索引0,则无法添加到索引1。

使用“真实”数组或SparseArray代替 - 您可以执行此操作。