我有2个java语句:
if(myvar!=null)
if(null!=myvar)
有些人说第二种形式更好,因为它有助于避免NPE,这是真的吗?通常在java中使用什么?
答案 0 :(得分:8)
if(myvar!=null) if(null!=myvar)
有些人说第二种形式更好,因为它有助于避免 NPE,是真的吗?
没有。这些是完全相同的,这里没有NPE的风险可以避免。
也许你把这个例子与这种情况混为一谈:
if (myvar.equals("something")) if ("something".equals(myvar))
此处,如果myvar
为null
,则第一个表单将抛出NPE,因为.equals
将取消引用null
值,但第二个表单工作正常,.equals
String
实现正常处理null
参数,在此示例中返回false
。因此,在此示例中,通常建议使用第二种形式。
一个相关的论点,其中一个是首选?
if (myvar == null) if (null == myvar)
考虑拼写错误的可能性,写一个=
代替==
:
if (myvar = null) if (null = myvar)
如果myvar
是Boolean
,则第一个表单将被编译,第二个表单将不会。所以看起来第二种形式似乎更安全。但是,对于任何其他变量类型,两种形式都不会编译。即使在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,请使用第一个表单。如果没有,请使用第二个。我确定在第二种形式是首选时会有其他几种情况,但目前无法提醒它。