Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Android Studio会用此代码发出空指针异常警告?_Java_Android Studio_Nullpointerexception - Fatal编程技术网

Java 为什么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

我在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_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()
一起使用,似乎可以达到目的。