为什么Android Studio会用此代码给出Null Pointer Exception警告?

时间:2019-06-09 20:23:53

标签: java android-studio nullpointerexception

我在Android Studio中具有以下代码,但收到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_ids

请注意,Hashmapsource_region,而StringtoString()

我相信我正在检查print(A[i,0:i-1]) 所依赖的所有内容中的空值,那么Android Studio为什么仍会发出此警告?

1 个答案:

答案 0 :(得分:1)

编译器应该能够看到您检查是否为空,但是在if语句中有很多条件,所以也许它超出了编译器性能的某个阈值。

>

由于else只不过是return,因此您应该翻转该语句。这样就无需分别声明变量。

我还将条件分开评论。

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

使用此代码,编译器不会感到困惑,因此不会发出警告,您只需在地图中查找一次即可。