我目前在以下代码中获得NullPointerException。
else if (isEmpty(href))
System.err.println("This is an empty link: " + href);
isEmpty函数如下所示。
public boolean isEmpty(String HREF){
if (HREF.equals("") || HREF.equals("null") || HREF == null || HREF.isEmpty())
return true;
else
return false;
}
是因为我无法将字符串与null进行比较吗?我该怎么做才能使这个功能起作用?
答案 0 :(得分:12)
您的isEmpty
测试只是按错误的顺序执行。改变这个:
if (HREF.equals("") || HREF.equals("null") || HREF == null || HREF.isEmpty())
return true;
为:
if (HREF == null || HREF.equals("") || HREF.equals("null") || HREF.isEmpty())
return true;
如果HREF
实际上是null
,那么第一次测试将short-circuit if
的剩余部分,您将无法获得NPE。
(顺便说一下,明确测试HREF.equals("")
并调用HREF.isEmpty()
是多余的。你只需要做一个或另一个。)
顺便说一句,我建议,将样法简化为单return
语句的方式:
public boolean isEmpty(String HREF){
return HREF == null || HREF.isEmpty()) || HREF.equals("null");
}
(另外,如果针对字符串"null"
进行测试是尝试检查null
值,那么您也可以放弃该条件。事实上,您可以使用类似Apache Commons的内容。 StringUtils.isEmpty(CharSequence)
方法来做你想做的事。)
答案 1 :(得分:1)
更改if中的顺序将解决它。
public boolean isEmpty(String HREF) {
return HREF == null || HREF.equals("") || HREF.equals("null") || HREF.isEmpty();
}
这样,当HREF == null时,不会评估其他任何测试。
答案 2 :(得分:1)
当HREF为null时,使用点运算符引用它将抛出空指针异常。
解决此问题的不同方法如下
public boolean isEmpty(String HREF){
if (HREF == null ||HREF.equals("") || HREF.equals("null") || HREF.isEmpty())
return true;
else
return false;
}
这只是通过简短的布尔运算来重新安排你的条件,这将避免在后续检查中引用空指针。
OR
public boolean isEmpty(String HREF){
//handling null case first of all
if(HREF == null) return true;
if(HREF.equals("") || HREF.equals("null") || HREF.isEmpty())
return true;
else
return false;
}
同时避免多余使用HREF.equals(“”)和HREF.isEmpty()之类的检查。
检查等于字符串对象的另一个最佳做法是在"".equals(HREF)
和"null".equals(HREF)
中使用开头的常量,这里我们非常确定"null"
是一个有效的字符串哪个不是null
答案 3 :(得分:0)
你不能在这里调用null的方法HREF.equals("")
通常的做法是更改订单"".equals(HREF)
。这是安全的。而且你不需要这样HREF.isEmpty()
部分。
所以代码将成为
public boolean isEmpty(String HREF){
return HREF == null || "".equals(HREF) || "null".equals(HREF);
}
我在这里删除了不必要的if
,因为我们返回了布尔表达式的结果。
答案 4 :(得分:-1)
如果HREF
为null,则执行以下操作:
HREF.equals("")
将抛出NPE。
先进行空检查:
HREF != null && /* rest of conditions */