Android:如何避免方法调用...可能会产生“ NullPointerException”警告?

时间:2019-08-16 09:09:45

标签: android nullpointerexception

我执行以下操作:

if (!items.containsKey(item) || items.get(item).getPrice() != 0) continue;

对于上述情况,我得到警告。为了避免它,我这样做

Objects.requireNonNull(items.get(item)).getPrice() != 0

以上方法有效,但它并不干净,无论如何,我只是检查了该项目是否存在,因此请确保它不是null。

有没有更清洁的方法?谢谢

这是完整的代码行:

if (!Utils.getInstance().items.containsKey(item.getId()) || Objects.requireNonNull(Utils.getInstance().items.get(item.getId())).getPrice() == 0) continue;

4 个答案:

答案 0 :(得分:1)

if (!Utils.getInstance().items.containsKey(item.getId()) || Objects.requireNonNull(Utils.getInstance().items.get(item.getId())).getPrice() == 0) continue;

这是代码的壮举!

您在一行中编写了很多逻辑,您需要将其划分为更易读的逻辑。


让我们简化您的代码,

首先,删除requireNonNull。所以会像这样:

 if (!Utils.getInstance().items.containsKey(item.getId()) || Utils.getInstance().items.get(item.getId()).getPrice() == 0) continue;

第二,将Utils.getInstance().items提取到单个变量中。因此,就像这样(在这里,我假设您将MapHashMap一起使用):

// assuming a HashMap
HashMap items = Utils.getInstance().items;

if (!items.containsKey(item.getId()) || items.get(item.getId()).getPrice() == 0) continue;

第三,我们将密钥提取为单个变量:

// assuming a HashMap
HashMap items = Utils.getInstance().items;

// assuming a string as the key
String key = item.getId();

if (!items.containsKey(key) || items.get(key).getPrice() == 0) continue;

现在,我们可以将or部分拆分为:

// assuming a HashMap
HashMap items = Utils.getInstance().items;

// assuming a string as the key
String key = item.getId();

if (!items.containsKey(key)) continue;

if(items.get(key).getPrice() == 0) continue;

最后一个代码将给您警告,因为Map.get()可以返回一个null值。您可以从Map.get()文档中看到。因此,我们需要警惕。

此处是最终版本

// assuming a HashMap
HashMap items = Utils.getInstance().items;

// assuming a string as the key
String key = item.getId();

if (!items.containsKey(key)) continue;

if(items.get(key) == null) continue;

if(items.get(key).getPrice() == 0) continue;

可能最终会为您的代码添加更多行。但这使您的代码更具可读性和可维护性,因为您无需费劲去理解代码。

答案 1 :(得分:0)

您可以使用@NonNull注释您的方法/变量

@NonNull
    fun test(){

    }

@NonNull
private lateinit var test:List<String>

答案 2 :(得分:0)

也许您应该将if条件更改为

if (!items.containsKey(item) || items.get(item).getPrice() != 0) continue;

if (items.get(item) == null || items.get(item).getPrice() != 0) continue;

答案 3 :(得分:0)

您无需确保OwnCloudAccount包含密钥public OwnCloudAccount(Uri baseUri, OwnCloudCredentials credentials),只需按照以下方式进行操作即可:

items