为啥下面的代码没有抛出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() 总是抛出?