【问题标题】:Is it bug of JDK?是JDK的bug吗?
【发布时间】:2013-04-12 13:53:46
【问题描述】:

这段代码抛出

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

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

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

【问题讨论】:

  • 一条建议:“永远不要把它归咎于工具。几乎总是因为你使用它的方式。”
  • 1) “是 JDK 的错误吗?” 应该是 “是 JRE 的错误吗?”,除非这是编译问题。 2) 新手发现 API 错误的几率相对于新手在代码中出错的几率约为 1,000,000 分之一。
  • 安德鲁,这些赔率有科研数据支持吗? ;)
  • ArrayIndexOutofBoundsException 是数组索引的错误使用,不是 JDK 中的错误。
  • 因为Arrays.asList(int[]{}) returns List<int[]> 而不是List<Integer> 甚至List<int>

标签: java runtime-error indexoutofboundsexception


【解决方案1】:

不,Arrays.asList 期望 Integer [],但您传递的是 int[]。这应该可以解决它。

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

【讨论】:

  • 作为参考,使用泛型会提前发现这个bug。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    为避免此类错误,切勿使用原始类型,而应使用泛型类型。你想要一个List 的整数吗?

    试试这个:

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

    编译器会在我写注释的那一行显示一个错误,表示这行不通。当ar 是原始数组时,int[] 在您的情况下,然后Arrays.asList(ar) 将返回List&lt;int[]&gt;List&lt;int[]&gt;List&lt;Integer&gt; 不兼容。您现在拥有的是int[] 中的List,其中包含 1 个条目(在索引 0 处),作为您的数组。

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

    【讨论】:

      【解决方案4】:

      来源asList: 和Collection is not support primitive types

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

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

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

      【讨论】:

        【解决方案5】:

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

        方法javadoc:

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

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

        【讨论】:

          猜你喜欢
          • 2011-09-13
          • 1970-01-01
          • 2012-12-21
          • 2017-03-05
          • 1970-01-01
          • 2016-07-12
          • 2011-01-25
          • 2022-12-20
          • 1970-01-01
          相关资源
          最近更新 更多