如何避免if条件下的nullpointerexception

ycl3bljg  于 2021-07-03  发布在  Java
关注(0)|答案(6)|浏览(271)

我必须采取一些行动,视情况而定。假设我有一个枚举“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?

atmip9wb

atmip9wb1#

只需反转等号的操作数:

if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType()))

对于getvouchertype()方法的null值返回,它永远不会给您nullpointerexception。当然,您必须确保事件对象从不为null。
或者,如其中一个注解中所建议的,使用==运算符,枚举可以:

if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP == event.getVoucherType())
iqjalb3h

iqjalb3h2#

根据维基图书的定义:
当应用程序尝试使用具有null值的对象引用时,会引发nullpointerexception。其中包括:对空引用引用的对象调用示例方法。
如果不示例化枚举值,则它的值为 null . 因此,程序试图引用一个包含 null ,它抛出一个 NullPointerException .
因此,没有,没有办法避免你的错误 NullPointerException . 在尝试引用变量之前,需要示例化变量。

cedebl8k

cedebl8k3#

除了前面提到的检查null的答案之外,另一种可能是实际创建一个表示null的额外枚举值(“伪值”),并将其用作默认值:

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,而是枚举值未定义。
警告:很多人更喜欢接收nullpointerexception而不是上面的解决方案,以便在忘记设置vouchertype时立即获得反馈。使用上面的解决方案,忘记设置vouchertype而没有实现它(因为代码不会抛出错误)的错误就容易多了。
此外,它可能会强制您检查某些操作的vouchertype是否仍然未定义,其中要求将其设置为有意义的值。
实际上,我宁愿自己检查null,但既然你说你想要其他解决方案,我想我还是发布这个。

bq3bfh9z

bq3bfh9z4#

在尝试检查enum.football的值之前,我会检查enum是否为null。

void method(){
        if(enum!=null && enum.Football){
            SomeAction();
        }
    }
wfveoks0

wfveoks05#

在对对象的属性进行任何测试之前,应该始终测试对象是否不为null。

if(enum != null && enum.Football) {
  //some action
}
aydmsdu9

aydmsdu96#

如果 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);
}

相关问题