方法调用可能会产生“NullPointerException”

Posted

技术标签:

【中文标题】方法调用可能会产生“NullPointerException”【英文标题】:Method invocation may produce 'NullPointerException' 【发布时间】:2020-11-05 02:12:48 【问题描述】:

我正在从我自己构建的 HashMap 中读取数据(所以我知道其中有哪些键):

List<UUID> cs = Arrays.asList(
        CHARACTERISTIC_A_UUID,
        CHARACTERISTIC_B_UUID,
        CHARACTERISTIC_C_UUID,
        CHARACTERISTIC_D_UUID,
        CHARACTERISTIC_E_UUID,
        CHARACTERISTIC_F_UUID,
        CHARACTERISTIC_G_UUID
);

HashMap<UUID, ReadResult> data = readDataFromBle(cs);

try 
    updateView(
            data.get(CHARACTERISTIC_A_UUID).getBoolValue(),
            data.get(CHARACTERISTIC_B_UUID).getIntValue(),
            data.get(CHARACTERISTIC_C_UUID).getIntValue(),
            data.get(CHARACTERISTIC_D_UUID).getIntValue(),
            data.get(CHARACTERISTIC_E_UUID).getIntValue(),
            data.get(CHARACTERISTIC_F_UUID).getBoolValue(),
            data.get(CHARACTERISTIC_G_UUID).getBoolValue()
    );
 catch (NullPointerException e) 
    Log.e("MAIN", "Missing characteristic", e);

android Studio 确信存在问题:

我该怎么办?如您所见,我尝试捕捉NullPointerException,但这似乎并不令人满意。

【问题讨论】:

嗯,建议你replace with Objects.requireNonNull(... :) @a_local_nobody 只是抛出一个NullPointerException。它的目的是什么?我还没有真正理解这个问题。另外,是否有不需要在每一行都使用样板的解决方案? 老实说我不知道​​,我同意这似乎真的多余,希望有人可以帮助您找到更好的解决方案,或者您可以取消警告,因为它看起来非常多余和安全跨度> @a_local_nobody 确实可以,当我这样做时,我看到检查称为ConstantConditions。现在它对我来说更没有意义了。 【参考方案1】:

比每行都有Objects.requireNonNull() 更具可读性,尽管字母数量几乎相同:

try 
    updateView(
        getReadResult(CHARACTERISTIC_A_UUID).getBoolValue(),
        getReadResult(CHARACTERISTIC_B_UUID).getIntValue(),
        getReadResult(CHARACTERISTIC_C_UUID).getIntValue(),
        getReadResult(CHARACTERISTIC_D_UUID).getIntValue(),
        getReadResult(CHARACTERISTIC_E_UUID).getIntValue(),
        getReadResult(CHARACTERISTIC_F_UUID).getBoolValue(),
        getReadResult(CHARACTERISTIC_G_UUID).getBoolValue()
    );
 
catch (NullPointerException e) 
    Log.e("MAIN", "Missing characteristic", e);

使用承诺返回非null 值的方法,如果给定UUID 没有条目,则会因NPE 而崩溃

@NonNull
private ReadResult getReadResult(UUID uuid)
    return Objects.requireNonNull(data.get(uuid));

【讨论】:

以上是关于方法调用可能会产生“NullPointerException”的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ 检查:“方法调用可能会产生 NullPointerException”。建议的修复有意义吗?

如何修复getActionBar方法可能会产生java.lang.NullPointerException

聊一聊 java8 中的 Optional

自定义的cell上面有图片时,如果产生了重用,图片可能会错乱问题

代码块(了解)

Java中线程死锁问题