Java 从hashmap中的'toString'避免'NullPointerException'`
我试图避免在某些代码中出现Java 从hashmap中的'toString'避免'NullPointerException'`,java,android,android-studio,nullpointerexception,Java,Android,Android Studio,Nullpointerexception,我试图避免在某些代码中出现NullPointerException,这些代码试图与HashMap中的字符串进行比较 HashMap定义得很好,但是HashMap中可能有也可能没有相应的条目,因此我相信这可能就是我的NPE和相关的Android Studio警告的来源 我的代码是: if (region_ids !=null && source_region != null && selected_id != null) { if (source_regio
NullPointerException
,这些代码试图与HashMap
中的字符串进行比较
HashMap
定义得很好,但是HashMap
中可能有也可能没有相应的条目,因此我相信这可能就是我的NPE和相关的Android Studio警告的来源
我的代码是:
if (region_ids !=null && source_region != null && selected_id != null) {
if (source_region.equals("it") && region_ids.containsKey("it") && !selected_id.equals(region_ids.get("it").toString())) {
// Do stuff for mismatched region
}
}
其中region\u id
是HashMap
我是否做了足够的工作来防止NullPointerException
s
如果是这样,为什么Android Studio还在IDE中给我警告
(请注意,Android Studio
标签是故意包含的,因为这个问题的最后一部分非常具体。)
更新 根据代码学徒的评论和Nosyara的回答,我现在对
if
语句有以下两种变体,但仍然在toString()
方法上得到NPE警告:
if ( region_ids_string != null && spin_region_id != null && source_region != null && selected_id != null && assoc_ids != null) {
if ( region_ids_string.size() > spin_region_id.getSelectedItemPosition()) {
if (source_region.equals("com_mx") && assoc_ids.get("com_mx") != null && assoc_ids.containsKey("com_mx") && !selected_id.equals(assoc_ids.get("com_mx").toString())) {
return true;
} else if ("com_au".equals(source_region) && assoc_ids.containsKey("com_au") && assoc_ids.get("com_au") != null && !assoc_ids.get("com_au").toString().equals(selected_id)) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
因此,我相信我现在正在检查
null
,”,以及键是否存在于HashMap
中,但我仍然相信语句可以生成一个NPE…如果将constant反转到左边,您将自动检查它是否为null。像这样:
if(“it”).equals(源区)和
区域ID.CONTANSKEY(“it”)和
!(region_id.get(“it”).toString().equals(selected_id))){
//为不匹配的区域做一些事情
}
我不知道NPE来自哪里,但找出它的基本步骤是相同的。把你的IF语句分成几段,然后开始打印出来。你可能会发现一些奇怪的事情。你确定这就是你的NPE的来源吗?我的问题是我自己无法重现错误。我只在GooglePlay开发者控制台中看到它的报告(但是混淆/除臭目前丢失了细节!)。事实上,我在IDE中看到了警告。因此,用if
子句来区分if
子句本身就是一个问题。如果还想知道我在这个上下文中是否正确地使用了containsKey()
。“我是否做了足够的工作来防止NullPointerException?”-不。在没有看到所有代码的情况下,region\u id.get(“it”)
可能会生成null makingregion\u id.get(“it”)。toString()
抛出NPE,如果您正在使用的Map实现允许空值,我认为region\u id.containsKey(“it”)将确保region\u id.get(“it”)不会null”。不是这样吗?如果没有,最好的检查方法是什么?我尝试了
region\u id.get(“it”)!=空`在if
而不是containsKey
测试中,但仍然在IDE中得到警告。“在上面我还检查了…”请显示与此口头解释一致的代码。哦,这是一个有趣的建议。总是这样吗?你能再解释一下它是如何工作的吗?因为它们可能真的很有用。我现在已经尝试过了,Android Studio仍然在给我关于toString()方法的警告。当然,必须有一种检查方法来确保使用这种方法是安全的。