2

我在 Eclipse 中遇到关于“可能的空指针取消引用”的警告,但我真的不明白为什么。警告出现在最后一行的以下代码片段中:

public void addMessage(Message message) {
   WeakReference<MessagesPanelControl> view = null;
   [...]
   if(view != null && view.get() != null)
     view.get().updateView();
}

由于之前的检查,我完全确定,这view不能为空。Eclipse 警告是:

错误:由于被调用方法的返回值,AC.GUI.MessageHandler.addMessage(Message) 中可能的空指针取消引用Bug:由于被调用方法的返回值,AC.GUI.MessageHandler.addMessage(Message) 中可能的空指针取消引用

如果它不是一个有效的警告,我该如何抑制它?甚至 @SuppressWarnings("all") 也不起作用。

4

2 回答 2

7

您的if语句与其正文之间存在竞争条件:

  • 你检查是否viewnull. 它不是。
  • 您检查view.get()(弱引用MessagesPanelControl)是否为null. 它不是。你进入if身体。
  • 垃圾收集器决定清除里面的值view
  • 你调用一个方法 on view.get(),即 now null

为了防止这种情况,您需要将弱引用转换为强引用,如下所示:

if(view != null) {
    MessagesPanelControl mpc = view.get();
    if(mpc != null)
        mpc.updateView();
}
于 2013-10-17T09:46:14.067 回答
7

您假设仅仅因为view.get()第一次返回一个非空值,它就会第二次返回一个非空值。它可能不会 - 可以在两次调用之间删除目标。您可以通过以下方式消除此问题:

if (view != null) {
    MessagesPanelControl value = view.get();
    if (value != null) {
        value.updateView();
    }
}
于 2013-10-17T09:45:06.887 回答