它是JDK的错误吗?

时间:2013-04-19 08:06:46

标签: java runtime-error indexoutofboundsexception

此代码抛出

  

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1

在最后一行。是bug还是什么? (JDK 7)

int ar[] = {1,2,3};
List arList = Arrays.asList(ar);
arList.set(1,8);

5 个答案:

答案 0 :(得分:9)

不,Arrays.asList需要Integer [],但您正在通过int[]。这应该解决它。

Integer ar[] = {1,2,3};

答案 1 :(得分:1)

这就是我的检查所说的使用原始数组,其中需要var-arg类型。

  

报告对变量参数方法的任何调用,该方法在变量参数位置具有原始数组(例如System.out.printf("%s", new int[]{1, 2, 3}))。这样的基本数组参数可能会令人困惑,因为它将被包装为单个元素数组,而不是像预期的那样被包装的每个单独元素。

这意味着你拥有的只有一个元素的List。这个元素就是你的int[]

并且您无法访问此列表中的位置1,因为只有一个元素。因此arList.set(1,8);会抛出ArrayIndexOutOfBoundsException

答案 2 :(得分:1)

要避免此类错误,请不要使用原始类型,而是选择泛型类型。你想要List整数?

试试这个:

int ar[] = {1,2,3};
List<Integer> arList = Arrays.asList(ar); // here
arList.set(1,8);

编译器将在我编写注释的行中显示错误,表明这不起作用。如果ar是原始数组{@ 1}},则int[]将返回Arrays.asList(ar)List<int[]>List<int[]>不兼容。你现在拥有的是List<Integer> List个1条目(索引0),是你的数组。

如前所述,如果您从原始int[]更改为对象int ar[] = {1,2,3};,它将起作用,因为Integer ar[] = {1,2,3};的返回类型将为Arrays.asList(ar)

答案 3 :(得分:0)

来源asList:和Collection is not support primitive types

Arrays.asList只期望引用类型,就像在你的情况下它应该是Integer而不是int

所以你可以编写如下代码:

Integer ar[] = {1,2,3};
List<Integer> arList = Arrays.asList(ar);
arList.set(1,8);

答案 4 :(得分:0)

指定行为的原因很明显,但是在Arrays.asList()的javadoc中没有任何关于这种情况的内容,也没有检查原始数组作为输入参数。所以,我认为这应该被视为一个错误。

方法javadoc:

返回由指定数组支持的固定大小的列表。 (对返回列表的更改“直写”到数组。)此方法充当基于数组和基于集合的API之间的桥梁,与{@link Collection#toArray}结合使用。返回的列表是可序列化的并实现{@link RandomAccess}。

此方法还提供了一种方便的方法来创建一个初始化为包含多个元素的固定大小的列表