我在Eclipse中遇到关于“可能的空指针取消引用”的警告,但我真的不明白为什么。警告发生在最后一行的以下代码段中:
public void addMessage(Message message) {
WeakReference<MessagesPanelControl> view = null;
[...]
if(view != null && view.get() != null)
view.get().updateView();
}
由于之前的检查,我完全确定,view
不能为空。 Eclipse警告是:
错误:由于被调用的methodBug的返回值,AC.GUI.MessageHandler.addMessage(Message)中可能出现空指针取消引用:由于被调用方法的返回值,AC.GUI.MessageHandler.addMessage(Message)中可能出现空指针取消引用
如果它不是有效的警告,我怎么能压制它?甚至@SuppressWarnings(“all”)都不起作用。
答案 0 :(得分:6)
您假设只是因为view.get()
第一次返回非空值,它将第二次返回非空值。它可能没有 - 目标可以在两个调用之间删除。您可以通过以下方式消除此问题:
if (view != null) {
MessagesPanelControl value = view.get();
if (value != null) {
value.updateView();
}
}
答案 1 :(得分:5)
您的if
声明与其正文之间存在竞争条件:
view
是否为null
。不是。view.get()
(弱引用的MessagesPanelControl
)是否为null
。不是。您输入if
正文。view
内的值。view.get()
上调用了一个方法,现在是null
。为了防止这种情况,您需要将弱引用转换为强引用,如下所示:
if(view != null) {
MessagesPanelControl mpc = view.get();
if(mpc != null)
mpc.updateView();
}