方法调用可能会产生“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