为啥下面的代码没有抛出IndexOutOfBoundsException,并打印出9 9 6?

Posted

技术标签:

【中文标题】为啥下面的代码没有抛出IndexOutOfBoundsException,并打印出9 9 6?【英文标题】:Why the following code does not throw IndexOutOfBoundsException, and print out 9 9 6?为什么下面的代码没有抛出IndexOutOfBoundsException,并打印出9 9 6? 【发布时间】:2011-10-15 04:17:09 【问题描述】:

我是 Java 新手。我有一个疑问。

class ArrTest 
  public static void main(String args[])
 
    int   i = 0; 
    int[] a = 3,6; 
    a[i] = i = 9; 
    System.out.println(i + " " + a[0] + " " + a[1]); // 9 9 6
   
 

【问题讨论】:

请注意,由于您(可能还有其他人)正在经历的困惑,永远尝试像a[i] = i = 9; 这样的“棘手”代码是一个好主意相反,将其分解为单独的行 - 后代会感谢你。 【参考方案1】:

这是另一个适用 Java 评估规则的好例子。

Java 从左到右解析地址。 a[i]a[0]的地址,然后i是i的地址,然后将9分配给i,然后将9分配给a[0]

IndexOutOfBoundsException 永远不会被抛出,因为a[0] 没有超出范围。 误解是a[9],这违反了left-to-right-rule

【讨论】:

【参考方案2】:

不应该。

a[i] = i = 9(使 i 等于 9) a[0] 也应该是 9,因为您为它分配了 9 (a[i] = i = 9),最初 a[0] 是 3 而 a[1] 为 6(初始值 (int[] a = 3, 6;)

你应该得到 9 9 6。

如果您执行 [2],那么它会给您一个 IndexOutOfBoundsException。

【讨论】:

以上是关于为啥下面的代码没有抛出IndexOutOfBoundsException,并打印出9 9 6?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MemoryStream.GetBuffer() 总是抛出?

为啥进程列表时抛出 java.lang.UnsupportedOperationException [重复]

为啥在构造函数中抛出异常会导致空引用?

finally 块下面的代码如何执行?

为啥这段代码没有抛出未定义的属性 PHP 通知?

为啥下面的代码没有将字符串“Write this to the file”写入文件“my_file”