Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有比使用ArrayList更好的方法让我不';无法获取IndexOutOfBounds异常?_Java_Android_Arraylist - Fatal编程技术网

Java 有没有比使用ArrayList更好的方法让我不';无法获取IndexOutOfBounds异常?

Java 有没有比使用ArrayList更好的方法让我不';无法获取IndexOutOfBounds异常?,java,android,arraylist,Java,Android,Arraylist,我有两个ArrayList: ArrayList<String> libraries = new ArrayList<String>(2); ArrayList<String> styles = new ArrayList<String>(2); ArrayList库=新的ArrayList(2); ArrayList样式=新的ArrayList(2); 我有3个复选框组件。这三个复选框用于向ArrayList添加或删除字符串,但是当选中jqM

我有两个ArrayList:

ArrayList<String> libraries = new ArrayList<String>(2);
ArrayList<String> styles = new ArrayList<String>(2);
ArrayList库=新的ArrayList(2);
ArrayList样式=新的ArrayList(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);
        }
    }
});
jqChk.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(jqChk.isChecked()){
库。添加(0,“\n”);
}如果(!jqChk.isChecked()){
库。删除(0);
}
}
});
jqMobileChk.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(jqMobileChk.isChecked()){
库。添加(1,“\n”);
}如果(!jqMobileChk.isChecked()),则为else{
图书馆。删除(1);
}
}
});
jqMobCSS.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(jqMobCSS.isChecked()){
样式。添加(0,“\n”);
}如果(!jqMobCSS.isChecked()){
样式。删除(0);
}
}
});
ofc idnex超出范围,因为大小为0


ofc idnex超出范围,因为大小为0,如果ArrayList中没有索引0,则无法添加到索引1


使用“实”数组,或者使用“实”数组-您可以在那里执行此操作。

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

使用“真实”数组或相反的数组-您可以在那里执行此操作。

一些问题:

  • 不要使用具体类型作为类型签名;改为使用该接口,以便以后可以根据需要切换实现。因此,请使用
    列表库=…
    而不是
    ArrayList库=…
  • 使用
    2
    作为构造函数的参数创建一个
    列表
    ,只会创建一个有两个元素空间的列表。这并不意味着它包含两个元素。当您执行
    libraries.remove(1)
    时,您正在删除甚至不存在的内容
  • 我认为
    地图
    可能更好,而不是在这里使用
    列表
不要执行
add(0,“…”
,而是执行
libraries.put(0,“…”)。要删除,您可以执行
库。删除(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);
        }
    }
});
几个问题:

  • 不要使用具体类型作为类型签名;改为使用该接口,以便以后可以根据需要切换实现。因此,请使用
    列表库=…
    而不是
    ArrayList库=…
  • 使用
    2
    作为构造函数的参数创建一个
    列表
    ,只会创建一个有两个元素空间的列表。这并不意味着它包含两个元素。当您执行
    libraries.remove(1)
    时,您正在删除甚至不存在的内容
  • 我认为
    地图
    可能更好,而不是在这里使用
    列表
不要执行
add(0,“…”
,而是执行
libraries.put(0,“…”)。要删除,您可以执行
库。删除(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);
        }
    }
});

抛出:
IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>大小())

数组列表中没有元素,因此异常

您可以使用

Map库=新的HashMap();
然后

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");
        }
    }
});
jqMobileChk.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(jqMobileChk.isChecked()){
libraries.put(“jqMobileChk”,“\n”);
}如果(!jqMobileChk.isChecked()),则为else{
图书馆。删除(“jqMobileChk”);
}
}
});
来自

抛出:
IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>大小())

数组列表中没有元素,因此异常

您可以使用

Map库=新的HashMap();
然后

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");
        }
    }
});
jqMobileChk.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(jqMobileChk.isChecked()){
libraries.put(“jqMobileChk”,“\n”);
}如果(!jqMobileChk.isChecked()),则为else{
图书馆。删除(“jqMobileChk”);
}
}
});

新建ArrayList(2)
不会创建包含2个元素的ArrayList。它最初是空的,即“内部”容量。同样,
add/remove
更改ArrayList的大小。ArrayList!=我不太清楚为什么这个问题不太可能对未来的访问者有所帮助。我发现这些答案非常有帮助,并且可能会帮助其他人克服ArrayList的缺陷。了解地图对象类型也很重要+感谢大家花时间解释事情。调试。这在编程中非常重要。IndexOutOfBounds、NullReferenceException等。。这些都是由非常特殊的条件造成的。附加调试器并查看。开发人员的工作是隔离发生这些情况的条件,以便解决问题。现在,看看标题——这真的会帮助任何人吗?不。现在,如果问题是在最小的测试用例中隔离出来的,那么可能。就像现在一样。。没有。我确实使用了调试器来查明导致IndexOutOfBounds的原因,但不知道如何修复它。如果不是我问的话,我就不会了解Map。
新建ArrayList(2)
不会创建包含2个元素的ArrayList。它最初是空的,即“内部”容量。同样,
add/remove
更改ArrayList的大小。ArrayList!=数组,不是真的
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");
        }
    }
});