2013-10-17 49 views
1

我在Eclipse中遇到了一個關於「可能的空指針解引用」的警告,但我真的不明白爲什麼。出現警告是在最後一行下面的代碼片段:Java + Eclipse:False可能的空指針解引用?

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

因爲檢查之前,我'完全確定的,即view不能爲空。 Eclipse的警告是:

錯誤:在AC.GUI.MessageHandler.addMessage(消息)可能的空指針引用到期歸還稱爲methodBug的價值:在AC.GUI.MessageHandler.addMessage可能的空指針引用(消息)由於被調用方法的返回值

如果它不是有效的警告,我該如何禁止它?即使@SuppressWarnings(「全部」)也不起作用。

+0

是什麼在'[...]'?你現在顯示的是'view'的* definite *'null'值。 – chrylis

+1

@chrylis我想他試圖告訴我們,警告似乎沒有任何意義,因爲他在調用view.get()。updateView()' – BackSlash

回答

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(); 
} 
+0

+1對於比賽條件 – RamonBoza

+0

+1對於比賽條件,現在問題似乎對我來說如此明顯:) – alex

6

你假設只是因爲view.get()第一次返回非空值,它將在第二次返回非空值。它可能不會 - 在兩次通話之間可以刪除目標。你可以用消除這種:

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

+1之前檢查'view'是'!= null'很好的解釋! – alex