此代码抛出
线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:1
在最后一行。是bug还是什么?(JDK 7)
int ar[] = {1,2,3};
List arList = Arrays.asList(ar);
arList.set(1,8);
此代码抛出
线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:1
在最后一行。是bug还是什么?(JDK 7)
int ar[] = {1,2,3};
List arList = Arrays.asList(ar);
arList.set(1,8);
不,Arrays.asList
期望Integer []
,但你正在通过int[]
。这应该解决它。
Integer ar[] = {1,2,3};
这就是我的检查所说的关于使用需要 var-arg 类型的原始数组的内容。
报告对可变参数方法的任何调用,该方法在可变参数位置(例如
System.out.printf("%s", new int[]{1, 2, 3})
)中有一个原始数组。这样的原始数组参数可能会令人困惑,因为它将包装为单个元素数组,而不是像预期的那样将每个单独的元素装箱。
这意味着您拥有的是一个只有一个元素的列表。而这个元素就是你的int[]
.
而且您无法访问1
此列表中的位置,因为只有一个元素。从而arList.set(1,8);
会抛出ArrayIndexOutOfBoundsException
。
为了避免这种错误,永远不要使用原始类型,而是更喜欢泛型类型。你想要一个List
整数?
尝试这个:
int ar[] = {1,2,3};
List<Integer> arList = Arrays.asList(ar); // here
arList.set(1,8);
编译器会在我写注释的那一行显示一个错误,表示这行不通。Whenar
是一个原始数组,int[]
在您的情况下,然后Arrays.asList(ar)
将返回一个List<int[]>
. List<int[]>
并且List<Integer>
不兼容。您现在拥有的是一个带有 1 个条目(在索引 0 处)的 of,作为您的数组List
。int[]
如前所述,如果您从原始更改int ar[] = {1,2,3};
为对象Integer ar[] = {1,2,3};
,它将起作用,因为返回类型Arrays.asList(ar)
将为List<Integer>
.
Source asList : 和 Collection 不支持原始类型
Arrays.asList
只期望引用类型,就像在你的情况下它应该是 Integer 而不是int
。
因此,您可以编写如下代码:
Integer ar[] = {1,2,3};
List<Integer> arList = Arrays.asList(ar);
arList.set(1,8);
指定行为的原因很清楚,但是 Arrays.asList() 的 javadoc 中没有关于这种情况的任何内容,并且没有检查原始数组作为输入参数。所以,我认为这应该被视为一个错误。
方法javadoc:
返回由指定数组支持的固定大小的列表。(更改返回的列表“直写”到数组。)此方法充当基于数组和基于集合的 API 之间的桥梁,与 {@link Collection#toArray} 结合使用。返回的列表是可序列化的并实现了 {@link RandomAccess}。
此方法还提供了一种方便的方法来创建一个固定大小的列表,该列表已初始化为包含多个元素