Java 如果更换&&;与&;在下面的代码中

Java 如果更换&&;与&;在下面的代码中,java,syntax,null,operators,Java,Syntax,Null,Operators,在一次采访中,我的面试官问我: 如果在以下代码中用&替换&&会出现什么问题: String a=null; if (a!=null && a.length()>10) {...} &&是逻辑AND运算符(执行短路行为,这意味着仅在需要时才计算第二个操作数) &是位AND运算符(位AND运算符执行位AND运算) 由于没有短路行为,您将得到NullPointerException 明白了: 此处的单个“与”将导致出现NullPointerException。 As&&是逻辑A

在一次采访中,我的面试官问我:
如果在以下代码中用&替换&&会出现什么问题:

String a=null; if (a!=null && a.length()>10) {...}
&&
是逻辑AND运算符(执行短路行为,这意味着仅在需要时才计算第二个操作数)

&
是位AND运算符(位AND运算符执行位AND运算)

由于没有短路行为,您将得到
NullPointerException

明白了:

此处的单个“与”将导致出现
NullPointerException

As&&是逻辑AND运算符,仅在需要时才对第二个操作数求值。

当使用
&
时,由于没有短路,将抛出
NullPointerException
,这意味着始终对右侧操作数求值,即使左侧操作数的结果为
false
。使用
&&
时,仅当左侧操作数为
true
时,才计算右侧操作数


Java语言规范中的章节和描述了这种行为。

当使用&&时,如果第一个表达式为false,则不会计算第二个表达式。 另一方面,&将对这两个表达式进行求值,无论发生什么情况


在您的例子中,如果将&&替换为&,它将抛出
NullPointedException

&
&
在表达式求值中具有不同的优先级,并且在相邻表达式周围没有
()
的情况下,在某些情况下,您可能会得到一些“惊喜”。特别是,
&&
在优先级中的位置比较晚,因此通常不需要将
()
与之结合,除非将混合逻辑表达式的结果组合在一起。但是,
&
的提前就足以让你放松警惕

&&
是短路,这意味着如果第一个表达式为false,则根本不计算第二个表达式<代码>&不短路。在上面的示例中,这意味着使用
&&
时,第二个表达式不会抛出NullPointerException,这通常是
&&
的一个重要特性


与Java以外的类C语言相关:一旦您克服了上述两个陷阱,就有了操作实际执行的问题。如果计算的两个表达式都产生“布尔”结果,则值将提升为0x00或0x01,
&
&
运算符将产生基本相同的答案。但是,如果其中一个表达式不是布尔表达式,那么您可能最终将0x01和0x02相加,并生成0x00,即使
&&
运算符的计算结果为true。(对于Java来说,这不是一个特别的问题,因为它不允许
&&
使用非布尔操作数,也不允许
&
使用混合布尔/整数操作数)

我已经回答了这个问题。;-)也可能是因为10分钟后你的回答和其他人一样。这是真的,但仅仅说它是如此并没有多大帮助。