Java 有人能解释一下我while循环中的错误吗

Java 有人能解释一下我while循环中的错误吗,java,Java,我一直在试图弄明白为什么代码一次又一次地给我一个arrayIndexOutOfBoundsException。出于绝望的尝试,我在while循环中反转了2个布尔条件,程序运行良好。这让我感到困惑的原因是,这两个条件由AND子句分隔,AND子句应该是可交换的 以下是有疑问的while语句: while(compareIndex>=0 && key<data[compareIndex])//works while(key<data[compareIndex] &am

我一直在试图弄明白为什么代码一次又一次地给我一个arrayIndexOutOfBoundsException。出于绝望的尝试,我在while循环中反转了2个布尔条件,程序运行良好。这让我感到困惑的原因是,这两个条件由AND子句分隔,AND子句应该是可交换的

以下是有疑问的while语句:

while(compareIndex>=0 && key<data[compareIndex])//works
while(key<data[compareIndex] && compareIndex>=0) //Crashes

while(compareIndex>=0&&key
int compareIndex=i-1;//当i==0时,就在第一个循环上,compareIndex的值是-1。当您尝试访问数据[-1]时,您会得到一个ArrayIndexOutOfBounds

当你这样做的时候

while(compareIndex>=0 && key<data[compareIndex])
while(key<data[compareIndex] && compareIndex>=0)
当(compareIndex>=0&&key=0为false时,代码从不尝试对key
但当你这么做的时候

while(compareIndex>=0 && key<data[compareIndex])
while(key<data[compareIndex] && compareIndex>=0)
while(键=0)

它尝试评估密钥它会崩溃,因为当您执行以下操作时:

while(key<data[compareIndex] && compareIndex>=0) //Crashes
while(key=0)//崩溃
compareIndex的键值是
i-1
=
0-1
=
-1

这不是有效的数组位置。
当您尝试另一种方法时,compareIndex>=0返回
false
,因此语句的第二部分根本不被检查。

compareIndex
是-1,因此当您这样做时

data[compareIndex] 
它崩溃是因为
-1
不是有效的索引


下面的代码没有崩溃的原因是因为短切

while(compareIndex>=0 && key<data[compareIndex])//works

这始终保证是代码> false <代码>,无论如何编译器都不去理会<代码>数据[COMPAREZIST] ,部分,这就是使它崩溃的原因。

< P>数组不能用负索引。在某些情况下,比如C++ GLUT,它不介意“减去”,因此可以编写数组[0 ] [-1 ]。它忽略了负数,并把它像数组[0 ] [1 ]一样(我在C++中用GLUT编程时,它就面临了),所以java是敏感的,在你做操作之前需要检查索引。(key=0)
崩溃是因为首先计算了数组
数据
中索引
compareIndex
处的值,但由于索引超出了数组
数据
的界限


另一方面,当您使用
时,将计算while(compareIndex>=0&&key=0
,如果为false(与您的情况相同),不检查下一个条件。

&&进行短路评估。假设
compareIndex
等于-1。在第二个条件中,将首先评估哪条语句?这是否有效?如果
i
0
i-1
-1
,因此
数据[compareIndex]
访问索引
-1
(该索引不存在且存在异常)我不太确定你在说什么。你能进一步解释一下如何进行和短路评估吗?@Maksim在
中的条件是按顺序计算的,当第一个条件为假时,其余条件根本不检查(如果存在和操作)@Maksim您可以在谷歌上搜索您的条件,而(compareIndex>=0&&key@Bedouin,那会有用的,但我想我会把我的答案集中在他的代码崩溃的原因上,以及他如何在未来的编程中识别这一点。感谢@AmirAfghani!随时提供的建议,很乐意帮助
while(false && something_else)