Java 为什么Android Studio会用此代码发出空指针异常警告?
我在Android Studio中有以下代码,但我收到一条警告,Java 为什么Android Studio会用此代码发出空指针异常警告?,java,android-studio,nullpointerexception,Java,Android Studio,Nullpointerexception,我在Android Studio中有以下代码,但我收到一条警告,方法调用'toString()'可能会产生'NullPointerException' String source_regions_user_id = ""; if (user_ids != null && "".equals(source_region) && user_ids.containsKey(source_region) && user_ids.get(source_reg
方法调用'toString()'可能会产生'NullPointerException'
String source_regions_user_id = "";
if (user_ids != null && "".equals(source_region) && user_ids.containsKey(source_region) && user_ids.get(source_region) != null && user_ids.get(source_region) != "") {
source_regions_user_id = user_ids.get(source_region).toString();
} else {
return true; // Unable to find a matching user_id for source_region
}
请注意,user\u id
是一个Hashmap
,source\u region
是一个字符串
我相信我正在检查toString()
所依赖的所有内容中的空值,那么为什么Android Studio仍然发出此警告?编译器应该能够看到您检查空值,但是if
语句中有许多条件,因此,它可能超过了编译器性能的某个阈值
由于else
只不过是一个返回值
,因此您应该将语句翻转过来。这样就不需要单独声明变量
我还将这些条件分开进行了评论
if (user_ids == null)
return true;
if (! "".equals(source_region)) // I think you meant the opposite check
return true;
if (! user_ids.containsKey(source_region)) // Redundant, the next check will cover this
return true;
if (user_ids.get(source_region) == null)
return true;
if (user_ids.get(source_region) == "") // Object is not a string, so this will always fail
return true;
String source_regions_user_id = user_ids.get(source_region).toString();
您还应该使用isEmpty()
或length()
检查空字符串,而不是与“
进行比较
因此,考虑到这些评论,我们可以将代码更改为:
if (user_ids == null || source_region.isEmpty())
return true;
Object obj = user_ids.get(source_region);
if (obj == null)
return true;
String source_regions_user_id = obj.toString();
if (source_regions_user_id.isEmpty())
return true;
// use value here
有了这段代码,编译器就不会感到困惑,因此没有警告,您只需在映射中查找一次。源代码区域的值是多少?最后一部分似乎不正确user\u id.get(source\u region)!=“”
将其更改为上一个检查!“”.equals(user\u id.get(source\u region))
@YCF\u L我会将其更改为!user_id.get(source_region).isEmpty()
,或者如果您不喜欢之间的“距离”
和isEmpty()
,使用user\u id.get(source\u region).length()0
@Andreas如果user\u id.get(source\u region)
返回空值怎么办?但是你可以告诉我,已经检查了user\u id.get(source\u region)!=空值
:)好点用户ID.containsKey(源区域)
是冗余的,因为if用户ID.get(源区域)!=null
为true,则containsKey
也为true。--<代码>“”。等于(源地区)
?!?你确定吗?你没有错过一个代码>,是吗?此外,如果映射(很可能)永远不会包含“
作为键,那么check reduntant不是吗?@YCF\u L否,第二条评论是针对OP的。谢谢,我将尝试将此信息转化为完整的解决方案,并在尝试后进行更新。将hashmap.get()
的结果分配给对象
,然后检查该对象是否为null
,并将该对象与toString()
一起使用,似乎可以达到目的。