我不得不采取取决于if条件几个动作。说我有一个枚举“VoucherType”
现在我有一个代码,即根据条件来执行: -
private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) {
if(event.getVoucherType().equals(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP)){
someAction();
}
return verifySystemAccountTransaction(event);
}
我必须执行someAction()如果事件类型是“GIVE_AWAY_MONEY_ON_SIGNUP”的。但我没有做任何多余的事件类型是其他什么比“GIVE_AWAY_MONEY_ON_SIGNUP”。所以,当我把这个代码,我设置了voucherType为“GIVE_AWAY_MONEY_ON_SIGNUP”和someAction()被执行。
但对于任何其他类型的事件,我得到空指针异常的情况,如果我从来没有,因为我不想做任何特殊的优惠券类型。因此,为了避免NullPointerException异常我设置券代码,虚拟的东西(其他voucherType值),我从来没有在任何条件下使用。我有一个复杂的方法,我可以消除空指针异常不初始化事件的VoucherType?
你应该总是测试,如果你的对象是不进行任何测试这个对象的属性之前空。
if(enum != null && enum.Football) {
//some action
}
如果event
从未null
,在这种情况下,也许你可以反转您的测试:
private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) {
if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType())){
someAction();
}
return verifySystemAccountTransaction(event);
}
否则你应该测试是否event
不前null
:
private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) {
if(event != null && VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType())){
someAction();
}
return verifySystemAccountTransaction(event);
}
定义由维基:
当应用程序试图使用一个对象引用,具有空值抛出NullPointerException。这些包括:调用通过一个空引用参考的对象上的实例方法。
如果没有实例化枚举值,它将有null
值。因此,该程序试图引用包含null
一个对象,该对象将引发NullPointerException
。
因此,没有,有没有办法避免你的NullPointerException
。你需要尝试引用之前实例变量。
我会检查,如果枚举不是试图签enum.Football前值空。
void method(){
if(enum!=null && enum.Football){
SomeAction();
}
}
除了检查空的已经提到的答案,另一种可能性是实际创建表示空(“虚拟价值”),一个额外的枚举值,并用其作为默认值:
public enum VoucherType {
UNDEFINED,
GIVE_AWAY_MONEY_ON_SIGNUP,
//....
;
}
定义“未定义”为默认值:
public class Event {
private VoucherType voucherType = VoucherType.UNDEFINED;
public Event() {
}
public VoucherType getVoucherType() {
return this.voucherType;
}
public void setVoucherType(VoucherType voucherType) {
if(voucherType==null) {
throw new IllegalArgumentException(); // make sure that voucher type cannot be set to null
}
this.voucherType=voucherType;
}
}
这样的事件将永远不会有null作为voucherType,而是枚举值不确定。
警告:很多人宁愿recieving一个NullPointerException,取代上述解决方案立刻得到反馈时,他们忘记设置voucherType。与上述解决方案使忘记设置voucherType并没有意识到它的错误(因为代码抛出没有错误)要容易得多。
此外,它可能会迫使你检查voucherType仍然是未定义一些操作,其中要求是,它被设置为meaningfull值。
我真的宁愿检查空自己,但既然你说你希望其他的解决方案,我想我反正张贴此。
简单地反转等号的操作数:
if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType()))
它永远不会让你的NullPointerException您getVoucherType()方法的空值的回报。当然,你必须保证事件对象永远不能为null。
或者,如在评论中使用==操作符的一个建议,有可能为枚举:
if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP == event.getVoucherType())