2009-08-07 49 views
2

可能重复:
Gracefully avoiding NullPointerException in Java
Multilingual fields in DB tablesIf-statement - 根据String对变量或变量检查字符串?

精确复制

Gracefully avoiding NullPointerException in Java

你喜欢什么吗?我只是讨厌看最后一个。它似乎倒退。

String randomtext = "stack overflow"; 

if(randomtext.equals("stack overflow")) 
{ 
     //do something 
} 

String randomtext = "stack overflow"; 

if("stack overflow".equals(randomtext)) 
{ 
    //do something 
} 
+0

Dupe of http://stackoverflow.com/questions/963936/gracefully-avoiding-nullpointerexception-in-java – 2009-08-07 21:48:12

+0

如果你确定randomtext是非空的,那么第一个是更具可读性的。 – 2009-08-07 22:17:05

回答

15

与某些人认为相反,这两个是功能不相同。第一个将抛出一个NullPointerException如果randomtextnull而第二个不会。这就是我选择后者的原因。

+0

+1 - 这是我没有想到的一个很好的观点,但是,您必须承认,例外的可能性取决于实施。 – 2009-08-07 21:53:32

+0

我其实并没有想到这一点。那是个很好的观点! – Tommy 2009-08-07 22:26:15

0

我想说的普遍看法会去朝第一,它是更具可读性。

0

根据实施情况,这可能是个人偏好。

现在,如果有可能randomtext将为空,我认为Merdad的帖子很重要。

但考虑到你的榜样,

String randomtext = "stack overflow"; 

if(randomtext.equals("stack overflow")) 
{ 
     //do something 
} 

它不会因为在这种情况下randomtext关系总是会被“堆栈溢出”。

如果你想知道哪个是“更好”,那么它取决于为什么这是更好的,这取决于你。

1

我更喜欢第一个。我喜欢写下如下条件:Test_Subject < - > Control_Value

2

如果字符串变量可以是null,您总是希望让字面先行。

"stack overflow".equals(randomtext) 

绝不会引起NullPointerException,但

randomtext.equals("stack overflow") 

意愿,如果randomtext == null

因此,尽管我喜欢variable.equals(文字),但我使用了前者。

0

我宁愿

String randomText = "stack overflow"; 
String otherRandomText = "something else"; 

if(randomText.equals(otherRandomText)) 
{ 
    //do something 
} 
+0

问题是为什么?你能否解释一下你的观点 - 我很感兴趣....请记住,otherRandomText将会记住这些,这可能就是为什么你的答案被拒绝了。 – 2009-08-07 21:58:27

0

我更喜欢第一个为好。正如Mehrdad指出的那样,第二种技术具有技术优势(不会在null上抛出异常),但我认为它不太自然。

我对if (null != myVar)有同样的感受 - 对我来说,它只是不正确。空字符串或字符串永远不会改变,所以询问它是否等于某些东西 - 虽然有意义并且字面上正确 - 似乎是错误的。

0

这取决于你的目的。

首先,你不应该在你的程序中有文字。这是标准实践,以防您必须在多个地方更改文本。所以真的这应该是一个常数或枚举。

考虑到这一点,你应该有 String randomtext =“stack overflow”; const String stackoverflow =“堆栈溢出”;

现在你要问哪个更好看之间 randomtext.equals(计算器) 和 stackoverflow.equals(randomtext)

我不知道它是否真的很重要。我通常会把实际的测试用例放在()中。

0

在C或C++,后一种结构的可能是优选的,因为它很容易混淆以下两个

如果(randomNumber == 5) 如果(randomNumber = 5)

的第二个是语法上有效的,但是赋值语句总是返回true,同时将randomNumber设置为5.这可能不是预期的。如果您使用的结构总是写你的C++比较习惯

如果(5 == randomNumber)

那么你更安全,因为如果你不小心写=代替==,编译器会尖叫在你身边。

这个观点并不能为原始发布的例子保存如此多的水,但它的确解释了为什么一些程序员养成了在进行比较时先保持不变的习惯,尽管大多数人认为其他方式似乎更多自然。旧习难改。

1

我倾向于检查空:

if(randomtext != null && randomtext.equals("stack overflow")) 
{ 
     //do something 
} 
0

我喜欢org.apache.commons.lang.StringUtils.equals()和它的所有相关的字符串函数。那么它是无效的,它是为你处理。

我相信所有在StringUtils中的方法都是无效的。