我在 Java 中注意到一些奇怪的事情,我不小心试图评估以下布尔表达式
if (something = null && false) // error
if (false && something = null) // no error
java编译器在意识到表达式无法实现时是否会停止表达式的求值?
在 Java 中,您无法在 null
和布尔类型之间进行转换。
布尔表达式是一个 Java 表达式,在计算时返回一个布尔值:true 或 false。
如您所见,布尔表达式用于条件语句,例如 if
、 while
和 switch
。
需要明确的是,您甚至不能像许多其他语言(如 C 语言(中通常发生的那样在整数和布尔类型之间进行转换。
null 没有给你任何错误的原因是 false &&&任何永远是 false,这样编译器就不会计算操作的第二个项,因为它已经知道答案 = false。
在第一种情况下:null && false,编译器计算第一个不是布尔值的项,正如编译器对"&&"操作的预期一样。所以它会抛出一个错误。
无论如何,在布尔运算中使用变量之前,您应该始终检查变量。
编辑:是的,我在编辑问题之前回答了,是的,我的答案无论如何都是错误的,我刚刚检查(对不起(。如果其中一个操作数不是布尔值,它将始终抛出错误。
Java 检查 and (&&( 逻辑运算符的第一个操作数,如果为 false,则不会计算第二个操作数。以及对于或 (||(Java 检查第一个操作数是否为真,然后,它不会计算第二个操作数。
如果要计算两个操作数,则可以改用位运算 (&, |(
在if语句中使用boolean
,null
不是boolean
所以两个表达式都是错误的。
也许你尝试使用:
if (something == null && false)
if (true && something == null)
在这种情况下,它们都是正确的。