如何避免在if条件的NullPointerException

问题描述 投票:1回答:6

我不得不采取取决于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?

java
6个回答
6
投票

你应该总是测试,如果你的对象是不进行任何测试这个对象的属性之前空。

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

3
投票

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

1
投票

定义由维基:

当应用程序试图使用一个对象引用,具有空值抛出NullPointerException。这些包括:调用通过一个空引用参考的对象上的实例方法。

如果没有实例化枚举值,它将有null值。因此,该程序试图引用包含null一个对象,该对象将引发NullPointerException

因此,没有,有没有办法避免你的NullPointerException。你需要尝试引用之前实例变量。


1
投票

我会检查,如果枚举不是试图签enum.Football前值空。

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

1
投票

除了检查空的已经提到的答案,另一种可能性是实际创建表示空(“虚拟价值”),一个额外的枚举值,并用其作为默认值:

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值。

我真的宁愿检查空自己,但既然你说你希望其他的解决方案,我想我反正张贴此。


0
投票

简单地反转等号的操作数:

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

它永远不会让你的NullPointerException您getVoucherType()方法的空值的回报。当然,你必须保证事件对象永远不能为null。

或者,如在评论中使用==操作符的一个建议,有可能为枚举:

if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP == event.getVoucherType())
© www.soinside.com 2019 - 2024. All rights reserved.