我目前正在浏览麻省理工学院的java软件课程,我不确定为什么会涉及一段代码。我尝试删除代码以确定是否有必要并且它使程序无法运行。
我有两个数组,一个是跑步者的名字,另一个是他们的时间。目标是找到最低(最快)时间的索引,然后给予该人第二快的时间。即命令提示符将输出john是最快的,而kate是第二快的
我感到困惑的部分是" secondIndex == -1 ||" ---这是为什么?如果我删除它我得到错误
线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:-1
public static int getSecondIndex(int[] values) {
int minIndex = getMinIndex(values);
int secondIndex = -1;
for(int i = 0; i < values.length; i++) {
if(i == minIndex){
continue;
}
if(secondIndex == -1 ||
values[i] < values[secondIndex]) {
secondIndex = i;
}
}
return secondIndex;
}
答案 0 :(得分:5)
然后它将评估在索引-1处没有条目的values[secondIndex]
。从左到右的||
短路,所以在secondIndex = -1的情况下,永远不会评估values[secondIndex]
。
答案 1 :(得分:1)
这是因为循环检查当前跑步者的时间是否小于目前为止的任何时间,但是当它检查第一个跑步者时,没有“迄今为止最快的跑步者”进行比较。因此,检查首先要确保secondIndex
至少已经设置过一次。如果没有,那么or语句的第二部分永远不会被评估(称为短路评估)。
答案 2 :(得分:0)
之所以存在,是因为how indexOf
works:它只能找到生活在索引0或更高位置的内容,因此如果无法找到任何内容,则返回-1。
因此,我们比较-1来看看是否找到了某些东西。如果不是,我们就不需要再浪费时间了:
if(thing.indexOf(otherthing) == -1) {
// the search failed
}
如果是,我们可以使用结果立即查看它,将indexOf的结果用作数组索引。
答案 3 :(得分:0)
在尚未找到secondIndex == -1
的情况下,此条件(secondIndex
)为真。请记住,由于||
是短路运算符,如果第一个条件为真,则不会计算第二个条件。因此,如果secondIndex
为-1,则永远不会评估values[secondIndex]
(这很好,因为这样做会导致ArrayIndexOutOfBoundsException
)。