我有:
Vector vector=new Vector();
vector.addElement("Nguyen");
vector.addElement("Viet");
vector.addElement("Jone");
vector.addElement(28);
vector.remove(28);
System.out.println("Vector: "+ vector);
在Vector中,我看到两种方法删除:
public boolean remove(Object obj)
public synchronized E remove(int index)
我只想使用public boolean remove(Object obj),但运行时会出错。有人可以向我解释为什么?它似乎是Vector的错误方法吗?
答案 0 :(得分:4)
简答:
索引位置 28 没有元素。您使用的remove
方法采用索引位置。要删除值 28 的元素,请使用vector.remove(Integer.valueOf(28));
答案很长:
Java中的Collection
(例如Vector
)只能保存对象而不是基元。 addElement
中的Vector
方法采用对象参数。当您说vector.addElement(28)
时, 28 的原始int
值被装箱到Integer
对象中,然后添加到Vector
。另一方面remove
方法有一个重载形式,它接受int
参数,所以当你说vector.remove(28)
时,会调用这个版本的方法,试图删除索引位置的元素28。
答案 1 :(得分:2)
您没有发布错误,但我希望它会IndexOutOfBoundsException
,对吧?
好的,这里发生了什么,Vector
是老式的,早在Autoboxing之前,支持自动取消装箱,反过来向向量中添加一个数字需要显式{ {1}}对象创建。删除 对象元素当然也需要相同。由于这是故事,该类的作者没有问题重载 2个具有相同名称的完全不同的方法,因为它是 完全不同 (不能以任何方式来回投射,参见Effective Java第194页)。
现在,在Java 5中,引入了自动装箱,但只有在真正需要的情况下才会这样做。在您的情况下,添加元素必须 autobox,因为不存在替代方法。相反,删除会产生歧义,因此它会选择更容易的那个,不需要自动装箱,导致调用错误的方法。
解决方案是通过manul拳击显式调用另一个方法:
Integer
答案 2 :(得分:1)
vector.remove(28)
尝试从Vector中删除第29个元素(具有索引28)。你的Vector没有那么多元素,所以你得到一个IndexOutOfBoundsException。
您应该考虑是否真的希望您的Vector包含String
和Integer
s。这通常表明设计不好。
答案 3 :(得分:0)
你必须低于错误
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 28
at java.util.Vector.remove(Unknown Source)
at TestInteger.main(TestInteger.java:14)
例外是自我解释的。原因是索引28没有元素
请参阅vector remove with index,但我相信您正在寻找remove object