当前位置:  开发笔记 > 编程语言 > 正文

Java ArrayList删除对象 - IndexOutOfBoundsException

如何解决《JavaArrayList删除对象-IndexOutOfBoundsException》经验,为你挑选了1个好方法。

我试图从ArrayList中删除一个对象,但我不断收到IndexOutOfBounds错误.现在有很多信息可用,为什么在删除迭代 ArrayList 会发生这种情况,但是我没有这样做.例:

 ArrayList a = new ArrayList();
 a.add('A');
 a.add('B');
 a.add('C');
 System.out.println(a);
 a.remove('A');
 System.out.println(a);

打印[A, B, C]然后失败:

java.lang.IndexOutOfBoundsException: Index: 65, Size: 3
    at java.util.ArrayList.rangeCheck(ArrayList.java:635)
    at java.util.ArrayList.remove(ArrayList.java:474)
    at b.(b.java:23)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at bluej.runtime.ExecServer$3.run(ExecServer.java:746)

为什么会这样?

编辑澄清这个问题不是一个重复这个问题:

这里发生的具体问题与迭代时删除元素时的常见问题无关.它更多是由重载的ArrayList remove方法和java 的自动类型转换char引起int的.

另一个问题的答案中没有涉及这方面.



1> rgettman..:

有两个重载remove方法 - 一个int用作索引,另一个Object用于删除对象引用本身.

JLS的第15.12.2节介绍了Java如何选择一种方法重载而不是另一种方法.

阶段是:

    第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第二阶段.

这保证了在Java SE 5.0之前在Java编程语言中有效的任何调用都不会因为引入变量arity方法,隐式装箱和/或取消装箱而被认为是不明确的.但是,变量arity方法(第8.4.1节)的声明可以更改为给定方法方法调用表达式选择的方法,因为变量arity方法在第一阶段被视为固定arity方法.例如,在已声明m(Object)的类中声明m(Object ...)会导致不再为某些调用表达式(例如m(null))选择m(Object),因为m(Object [] )更具体.

    第二阶段(§15.12.2.3)执行重载解析,同时允许装箱和拆箱,但仍然排除使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第三阶段.

这确保了如果通过固定的arity方法调用适用,则永远不会通过变量arity方法调用来选择方法.

    第三阶段(§15.12.2.4)允许重载与变量arity方法,装箱和拆箱相结合.

(大胆强调我的)

这两种方法都适用于此,因为a char可以提升为a int,但也可以将其加到Character匹配a的类型参数中.但是Java会在任何需要装箱的方法之前单独选择促销,因此'A'被提升为int,因此价值65.

Character如果要通过对象引用删除,可以显式转换它.

a.remove((Character) 'A');

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有