当参数为null时,以下代码片段会抛出NPE吗?
public void doSomething(String string) {
if (string.trim().equals("") || string==null) {
[...]
}
}
我在其他人的代码中找到了这个(其他人应该比我更有经验)。由于我一直面临着这段代码的困难,我想问一下是否应该反转比较,或者Java编译器是否足够聪明以交换操作数。我没有对这段代码的直接控制,也没有因为许多catch块而抛出NPE。
谢谢
答案 0 :(得分:16)
是。当NullPointerException
为string
时,该代码片段会抛出null
。建议将其更改为以下内容:
public void doSomething(String string) {
if (string==null || string.trim().equals("")) {
// ...
}
}
答案 1 :(得分:4)
它将抛出NullPointerException
,因为如果string
为空并且您尝试修剪null
,则会抛出异常。在尝试trim().
答案 2 :(得分:3)
[注意:您是否刚尝试运行此操作以确定是否会引发异常?]
答案 3 :(得分:2)
相同优先级的二元运算符总是从左到右进行求值,除了赋值(几乎我能想到的每种语言)这在这种情况下很重要,因为||
是一个捷径运算符。如果结果已知,即第一个表达式为真,则不评估第二个表达式。因此,使用||
和&&
检查null的正确方法如下所示。
if(text == null || text.method())
或
if(text != null && text.method2())
顺序是这样的,因为我们用英语从左到右(从上到下)阅读。 C.F.在日语中,您从上到下,从右到左阅读。
答案 4 :(得分:2)
是的,每个合理的IDE都会抱怨这段代码,因为右半部分永远无法评估。
if (string.trim().equals("") || string==null) {
如果字符串为null,则左侧部分抛出NPE,因此右侧部分永远不会被评估
答案 5 :(得分:2)
尝试使用if(!"".equals(someString))
,这样可以避免显式的空检查