2013-03-15 39 views
2

,所以我有此方法:數據庫返回空至一個布爾變量

class A(){ 

private Boolean Flag; 

public java.lang.Boolean getFlag() 
    { 
     return this.Flag; 
    } 

public java.lang.Boolean setFlag(Boolean Flag) 
    { 
     this.Flag = Flag ; 
    } 
} 

classB(){ 

boolean navalFlag = fancyObj.getFlag() 
form.setNavalFlag(navalFlag?"Y":"N"; 

} 

數據庫返回null和Flag被設置爲空。

什麼是萬能的方法,我可以100%避免 NPEs?我知道Booleanboolean鑄造並不能保證從here

更新看出: 單步調試代碼中,NPE被拋出在fancyObj.getFlag() ......這沒有任何意義了我。我會期待NPE扔在.setNavalFlag....

回答

2

什麼是萬無一失的方式,我可以100%避免NPE?

一個萬無一失的方法是顯式檢查null並沒有試圖拆箱Boolean,除非你知道這不是null

要利用當前的代碼爲例:

​​

這將嘗試拆箱布爾。如果是null,你會得到一個NPE。

以下修改不會有這樣的問題:

Boolean navalFlag = fancyObj.getFlag() 
form.setNavalFlag((navalFlag != null && navalFlag) ? "Y" : "N"); 
+0

你的意思是'unbox'布爾值是什麼意思? – bouncingHippo 2013-03-15 19:23:17

+0

@bouncingHippo:將其轉換爲'boolean'(小寫'b')。 – NPE 2013-03-15 19:24:15

+0

閱讀更多關於它[這裏](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) – A4L 2013-03-15 19:25:05

0
Boolean navalFlag = fancyObj.getFlag() 
form.setNavalFlag((navalflag != null && navalFlag) ? "Y" : "N"); 

編輯的編輯,因爲我懂得了錯誤您的評論:

見我的回答對您的註釋:boolean navalFlag = fancyObj.getFlag()會自動翻譯爲boolean navalFlag = fancyObj.getFlag().booleanValue()

+0

NPE被拋出'fancyObj.getFlag()'...它不會'對我有意義 – bouncingHippo 2013-03-15 19:22:07

+0

問題是'boolean navalFlag = fancyObj.getFlag()'真的意味着'boolean navalFlag = fancyObj.getFlag()。booleanValue()'(自動轉換過程名爲unboxing) – Steph 2013-03-15 19:30:17

0

更改您的方法

public java.lang.Boolean getFlag() 
{ 
    return this.Flag; 
} 

喜歡的東西

public java.lang.Boolean getFlag() 
{ 
    (Flag==null) ? Boolean.FALSE : Flag; 
} 
0

使用布爾原始類型,而不是在你的價值對象包裝。

如果您自己從數據庫中檢索值,您必須小心,您將不得不瞭解如何解釋null,通常它是錯誤的。