Java + Eclipse:错误的空指针取消引用?

ale*_*lex 1 java eclipse warnings

我在Eclipse中遇到关于"可能的空指针取消引用"的警告,但我真的不明白为什么.警告发生在最后一行的以下代码段中:

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

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

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

如果它不是一个有效的警告,我怎么能抑制它?即使@SuppressWarnings("all")也不起作用.

Jon*_*eet 6

你假设只是因为view.get()第一次返回一个非空值,它将第二次返回一个非空值.它可能没有 - 目标可以在两个调用之间删除.您可以通过以下方式消除此

if (view != null) {
    MessagesPanelControl value = view.get();
    if (value != null) {
        value.updateView();
    }
}
Run Code Online (Sandbox Code Playgroud)


chr*_*ke- 5

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

  • 你检查是否viewnull.不是.
  • 你检查view.get()(弱引用MessagesPanelControl)是否null.不是.你进入了if身体.
  • 垃圾收集器决定清除里面的值view.
  • 你调用一个方法view.get(),这是现在null.

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

if(view != null) {
    MessagesPanelControl mpc = view.get();
    if(mpc != null)
        mpc.updateView();
}
Run Code Online (Sandbox Code Playgroud)