如果我有以下if语句
if ( (row != -1) && (array[row][col] != 10) ) {
....
}
其中row
为int
值且array
为int[][]
个对象。
我的问题是,如果row = -1会抛出异常,因为数组不会有-1字段,那么out of bounds exception?或者它会停在if的第一部分(行!= - 1),因为这是假的,它会忽略其余部分吗? 或者为了确保它不会抛出异常,我应该将上面的if语句分成两个?
(请不要告诉我为自己检查一下:)我在这里问'因为我想问一个后续问题......)
答案 0 :(得分:3)
它会在抛出异常之前安全停止
&&
是short-circuiting boolean operator,这意味着只要一个部分返回false,它就会停止执行表达式(因为这意味着整个表达式必须为false)。
请注意,它还保证按顺序评估表达式的各个部分,因此在这些情况下使用是安全的。
答案 1 :(得分:2)
它不会抛出异常。但是,如果行是< -1(例如-2),那么你将遇到问题。
答案 2 :(得分:1)
它会在if的第一部分停止。 Java使用short circuite evaluation。
答案 3 :(得分:1)
不,它不会。如果第一个表达式为假,则编译器不会检查第二个表达式...这就是为什么&&被称为“短路”操作员...
答案 4 :(得分:1)
通过&&
调用short-circuit evaluation,如果行检查失败,则继续评估没有意义。
答案 5 :(得分:1)
当第一个表达式返回false
进行AND测试而true
进行OR测试时,大多数编程语言都会使测试短路。在您的情况下,AND测试将被短路,并且不会发生异常。
答案 6 :(得分:1)
许多编程语言对于逻辑运算符都有short-circuit evaluation。
在A and B
等语句中,语言将首先评估A
。如果A
为false,则整个表达式为false;无论B是真还是假都没关系。
在您的情况下,当row
等于-1
时,row != -1
将为false,并且不会评估数组表达式的短路。
此外,关于数组索引行为的第二个问题完全取决于语言。在C中,array[n]
表示*(array + n)
。在python中,array[-1]
为您提供数组中的最后一项。在C ++中,您可能有一个带有重载[]
运算符的数组,该运算符也接受负索引。在Java中,您将获得ArrayIndexOutOfBoundsException。
答案 7 :(得分:1)
此外,您可能需要以下内容(或使用try / catch)。
boolean isItSafe(int[][] a, int x, int y) {
boolean isSafe = true;
if (a == null || a.length == 0 || x >= a.length || x < 0 || y < 0 || y >= a[0].length ) {
isSafe = false;
}
return isSafe;
}