0

此代码抛出

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

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

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

5 回答 5

9

不,Arrays.asList期望Integer [],但你正在通过int[]。这应该解决它。

Integer ar[] = {1,2,3};
于 2013-04-19T08:07:21.333 回答
1

这就是我的检查所说的关于使用需要 var-arg 类型的原始数组的内容。

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

这意味着您拥有的是一个只有一个元素的列表。而这个元素就是你的int[].

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

于 2013-04-19T08:17:53.257 回答
1

为了避免这种错误,永远不要使用原始类型,而是更喜欢泛型类型。你想要一个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,作为您的数组Listint[]

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

于 2013-04-19T08:18:35.567 回答
0

Source asList : 和 Collection 不支持原始类型

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

因此,您可以编写如下代码:

Integer ar[] = {1,2,3};
List<Integer> arList = Arrays.asList(ar);
arList.set(1,8);
于 2013-04-19T08:17:30.643 回答
0

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

方法javadoc:

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

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

于 2013-04-19T08:35:58.300 回答