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