我必须采取一些行动,视情况而定。假设我有一个枚举“vouchertype”
现在我有一个代码,根据condition:-
private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) {
if(event.getVoucherType().equals(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP)){
someAction();
}
return verifySystemAccountTransaction(event);
}
如果事件类型为“在注册时赠送钱”,我必须执行someaction()。但是我不需要做任何额外的事情,因为事件类型是“在注册时给钱”。因此,当我调用此代码时,我将vouchertype设置为“give\u away\u money\u on \u signup”,并执行someaction()。
但是对于任何其他类型的事件,我在if条件中得到空指针异常,因为我从不设置凭证类型,因为我不想做任何特殊的事情。因此,为了避免nullpointerexception,我将凭证代码设置为在任何条件下都不会使用的伪值(其他vouchertype值)。有没有一种复杂的方法可以消除nullpointerexception,而不必在事件中初始化vouchertype?
6条答案
按热度按时间atmip9wb1#
只需反转等号的操作数:
对于getvouchertype()方法的null值返回,它永远不会给您nullpointerexception。当然,您必须确保事件对象从不为null。
或者,如其中一个注解中所建议的,使用==运算符,枚举可以:
iqjalb3h2#
根据维基图书的定义:
当应用程序尝试使用具有null值的对象引用时,会引发nullpointerexception。其中包括:对空引用引用的对象调用示例方法。
如果不示例化枚举值,则它的值为
null
. 因此,程序试图引用一个包含null
,它抛出一个NullPointerException
.因此,没有,没有办法避免你的错误
NullPointerException
. 在尝试引用变量之前,需要示例化变量。cedebl8k3#
除了前面提到的检查null的答案之外,另一种可能是实际创建一个表示null的额外枚举值(“伪值”),并将其用作默认值:
将“未定义”定义为默认值:
这样,事件将永远不会有null作为vouchertype,而是枚举值未定义。
警告:很多人更喜欢接收nullpointerexception而不是上面的解决方案,以便在忘记设置vouchertype时立即获得反馈。使用上面的解决方案,忘记设置vouchertype而没有实现它(因为代码不会抛出错误)的错误就容易多了。
此外,它可能会强制您检查某些操作的vouchertype是否仍然未定义,其中要求将其设置为有意义的值。
实际上,我宁愿自己检查null,但既然你说你想要其他解决方案,我想我还是发布这个。
bq3bfh9z4#
在尝试检查enum.football的值之前,我会检查enum是否为null。
wfveoks05#
在对对象的属性进行任何测试之前,应该始终测试对象是否不为null。
aydmsdu96#
如果
event
永远不会null
,在这种情况下,您可以反转测试:否则你应该测试一下
event
不是null
之前: