2013-03-15 37 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,通常它是错误的。