检查空值样式的变量

时间:2015-12-25 22:50:14

标签: java

我有2个java语句:

if(myvar!=null)

if(null!=myvar)

有些人说第二种形式更好,因为它有助于避免NPE,这是真的吗?通常在java中使用什么?

6 个答案:

答案 0 :(得分:8)

if(myvar!=null)

if(null!=myvar)
     

有些人说第二种形式更好,因为它有助于避免   NPE,是真的吗?

没有。这些是完全相同的,这里没有NPE的风险可以避免。

也许你把这个例子与这种情况混为一谈:

if (myvar.equals("something"))

if ("something".equals(myvar))

此处,如果myvarnull,则第一个表单将抛出NPE,因为.equals将取消引用null值,但第二个表单工作正常,.equals String实现正常处理null参数,在此示例中返回false。因此,在此示例中,通常建议使用第二种形式。

一个相关的论点,其中一个是首选?

if (myvar == null)

if (null == myvar)

考虑拼写错误的可能性,写一个=代替==

if (myvar = null)

if (null = myvar)

如果myvarBoolean,则第一个表单将被编译,第二个表单将不会。所以看起来第二种形式似乎更安全。但是,对于任何其他变量类型,两种形式都不会编译。即使在Boolean的情况下,损坏也非常有限,因为无论myvar的值如何,当{{{{>}时,程序将始终与NPE崩溃由于取消装箱if值,因此达到了1}}语句。

由于没有任何测试可以通过此声明,并且由于您不应该发布未经测试的代码,因此犯这样的错误是不现实的。

简而言之,安全利益微不足道,几乎不存在,所以我没有理由不喜欢这种不同寻常的写作风格。

<强>更新

正如@Nitek在评论中所指出的那样,采用第二种形式的一个优点是,如果你养成习惯,那么当你用null编译的其他语言进行编程时,你可以'在你的“好习惯”之外,要稍微安全一些。

我仍然指出,在许多语言中,与myvar = null的比较是特殊的,不存在这种拼写错误的可能性。例如,在Python中,null不正确,应该写为myvar == None,因此不再有myvar is None错误输入。

严格来说,虽然==写作风格不能保护所有语言,但它可能会保护你,所以我不得不承认这似乎是一个好习惯。

答案 1 :(得分:4)

事实并非如此,它们是一样的。

我更喜欢第一个,因为我觉得它看起来更好。

if(myvar!=null)

如果myvar不等于null

if(null!=myvar)

如果null不等于myvar

答案 2 :(得分:4)

两者都没有一定区别,两者都指的是相同的检查

if(myvar!=null)
if(null!=myvar)

两者完全相同。 但在depper上下文中,它是Yoda Condition

由于其可读性问题,它通常受到批评,所以尽量为自己和其他可能阅读代码的人制作简单的东西,因为这不是标准符号。

答案 3 :(得分:3)

这是主要的意见,但我总是与

一起使用
if (variable == null)
if (variable != null)

因为imo是一种更好的编程风格。

对你的帖子做一个简短的回答,他们之间没有区别

答案 4 :(得分:3)

您的情况没有实际差异。

  

15.21。平等运营商

     
    

如果操作数表达式没有副作用,则相等运算符是可交换的。

  

也就是说,你可能的情况是LHS和RHS很重要,因为评估它们会引起另一个的变化,但如果其中一个是关键字null则不会。

考虑以下示例:

public class Example {

    static int x = 0;

    public static void main(String[] args) {

        System.out.println(doit() == x); // false
        System.out.println(x == doit()); // true
    }

    static int doit() {

        x++;
        return 0;
    }
}

此外,

  

15.21.3。参考等式运算符==和!=

     
    

如果操作数值都为null或者两者都引用相同的对象或数组,则!=的结果为false;否则,结果是真的。

  

显示评估没有差异。

答案 5 :(得分:0)

正如Nitek在评论中写到我最初的问题:

The second one prevents typos like "myvar=null" because "null=myvar" won't compile. Might save you some trouble. 

因此,我们有第二种形式的巨大优势 - 它有助于防止严重的逻辑错误。例如:

Boolean i=false;
....
if(null=i){

}

不会编译 但

Boolean i=false;
....
if(i=null){

}

但第二种形式有一个很大的缺点 - 它的阅读困难。 所以我会说在99%的情况下第一种形式是好的,但我更喜欢使用第二种形式。如果您确定不会混合==和= up,请使用第一个表单。如果没有,请使用第二个。我确定在第二种形式是首选时会有其他几种情况,但目前无法提醒它。