OR比较的Java顺序

当参数为null时,以下代码片段会抛出NPE吗?

public void doSomething(String string) { if (string.trim().equals("") || string==null) { [...] } } 

我在其他人的代码中找到了这个(其他人应该比我更有经验)。 由于我一直面临着这段代码的困难,我想问一下比较是否应该反转,或者Java编译器是否足够聪明以交换操作数。 我没有直接控制这个代码,也没有因为许多catch块而引发NPE。

谢谢

是。 当stringnull时,该代码片段将抛出NullPointerException 。 建议将其更改为以下内容:

 public void doSomething(String string) { if (string==null || string.trim().equals("")) { // ... } } 

它将抛出NullPointerException因为如果string为null并且您尝试修剪null ,则会抛出exception。 在尝试trim().之前尝试进行null检查trim().

是的,这看起来很狡猾。 几乎可以肯定的是反过来。 Java逻辑运算符(如C和C ++)具有“短路”function,首先评估左侧操作数,然后仅在需要时评估右侧操作数。

[注意:难道你不能尝试运行它来查明它是否会引发exception吗?]

是的,每个合理的IDE都会抱怨这个代码,因为右半部分永远无法评估。

  if (string.trim().equals("") || string==null) { 

如果字符串为null,则左侧部分抛出NPE,因此右侧部分永远不会被评估

尝试使用if(!"".equals(someString)) ,这样可以避免显式的空检查

除了赋值之外,相同优先级的二元运算符总是从左到右进行求值(在我能想到的几乎所有语言中)这在这种情况下很重要,因为|| 是一个捷径的运营商。 如果结果已知,即第一个表达式为真,则不会计算第二个表达式。 所以使用||的正确方法 和&&检查null如下所示。

 if(text == null || text.method()) 

要么

 if(text != null && text.method2()) 

订单是这样的,因为我们用英语从左到右(从上到下)阅读。 cf在日语中,您从上到下,从右到左阅读。