【问题标题】:Why ArrayIndexOutOfBoundsException for 2D Array and NPE for 1D array为什么 ArrayIndexOutOfBoundsException 用于 2D 数组而 NPE 用于 1D 数组
【发布时间】:2021-08-14 03:24:13
【问题描述】:

请帮助我理解为什么下面的代码会抛出 ArrayIndexOutOfBoundsException

Integer[][] arr1 = { { 1, 2, 3 }, { null }, { 7, 8, 9 } };
System.out.println("value = " + arr1[1][1].intValue());

对一维数组执行类似代码时会抛出 NullPointerException。

Integer[] arr2 = { new Integer(1) , null , new Integer(2) };
System.out.println("value = " + arr2[1].intValue());

据我了解,我应该为一维和二维数组获得 NPE。

【问题讨论】:

  • 在第一种情况下,arr1[1]{null},一个带有 one 元素的数组。所以arr1[1][1] 是一个索引错误。在第二种情况下,arr2[1] 为 null,因此尝试对其调用方法会产生 NPE。
  • 如果您尝试使用arr1[1][0] 访问空元素,那么您将获得NPE。
  • @GriffeyDog 澄清一下,通过arr1[1][0] 访问 null 不会导致NPE。但是之后我们成功访问它arr1[1][0].intValue()会变成null.intValue()并且那个call会抛出NPE。
  • @Pshemo 这就是我在评论中的意图,访问该元素上的 intValue 方法。我的意思是 null 元素位于索引 0,而不是 1。

标签: java arrays exception indexoutofboundsexception


【解决方案1】:

这是因为索引1 (arr1[1]) 处的数组是一个有效数组,其中包含1 个null。如果您检查了arr1[1][0],它将毫无例外地返回null。你得到一个ArrayIndexOutOfBoundsException,因为它是一个有效的数组,但在索引0结束。

如果您将代码切换为:

Integer[][] arr1 = { { 1, 2, 3 }, null, { 7, 8, 9 } };

其中索引arr1[1] 实际上是null(而不是其中包含null 的数组),那么你会得到一个NullPointerException

【讨论】:

    【解决方案2】:

    如果你想在第一种情况下产生 NullPointerException,你必须替换:

    Integer[][] arr1 = { { 1, 2, 3 }, { null }, { 7, 8, 9 } };
    System.out.println("value = " + arr1[1][1].intValue());
    

    与:

    Integer[][] arr1 = { { 1, 2, 3 }, { null, null }, { 7, 8, 9 } };
    System.out.println("value = " + arr1[1][1].intValue());
    

    使单个 array1 元素 arr1[1][1] 为空。

    否则arr1[1][1] 不会被实例化,你会得到ArrayIndexOutOfBoundsException

    【讨论】:

      猜你喜欢
      • 2018-04-08
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2021-03-19
      • 2017-07-29
      • 2018-08-06
      • 1970-01-01
      • 2017-06-18
      相关资源
      最近更新 更多