Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java+;Eclipse:错误-可能的空指针取消引用?_Java_Eclipse_Warnings - Fatal编程技术网

Java+;Eclipse:错误-可能的空指针取消引用?

Java+;Eclipse:错误-可能的空指针取消引用?,java,eclipse,warnings,Java,Eclipse,Warnings,我在Eclipse中遇到一个关于“可能的空指针取消引用”的警告,但我真的不明白为什么。警告出现在最后一行的以下代码段中: public void addMessage(Message message) { WeakReference<MessagesPanelControl> view = null; [...] if(view != null && view.get() != null) view.get().updateView();

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

public void addMessage(Message message) {
   WeakReference<MessagesPanelControl> view = null;
   [...]
   if(view != null && view.get() != null)
     view.get().updateView();
}
public void addMessage(消息消息消息){
WeakReference视图=空;
[...]
if(view!=null&&view.get()!=null)
view.get().updateView();
}
由于前面的检查,我完全确定,
view
不能为空。Eclipse警告是:

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


如果这不是一个有效的警告,我怎样才能消除它?即使@SuppressWarnings(“all”)也不起作用。

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

if (view != null) {
    MessagesPanelControl value = view.get();
    if (value != null) {
        value.updateView();
    }
}

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

  • 检查
    view
    是否为
    null
    。不是
  • 检查
    view.get()
    (弱引用的
    MessagesPanelControl
    )是否为
    null
    。不是。输入
    if
    正文
  • 垃圾收集器决定清除
    视图中的值
  • view.get()
    上调用一个方法,该方法现在为
    null
要防止出现这种情况,需要将弱引用转换为强引用,如下所示:

if(view != null) {
    MessagesPanelControl mpc = view.get();
    if(mpc != null)
        mpc.updateView();
}

[…]
中有什么内容?您现在显示的是
视图的一个明确的
null
@chrylis我想他是想告诉我们,这个警告似乎没有意义,因为他正在检查
视图
是否为
!=null
在调用
view.get().updateView()之前,对于竞争条件,现在问题对我来说太明显了:)