Java 有没有比使用ArrayList更好的方法让我不';无法获取IndexOutOfBounds异常?
我有两个ArrayList: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<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");
}
}
});