如何在条件中避免NullPointerException

时间:2016-05-10 14:14:39

标签: java

我必须采取一些行动取决于if条件。假设我有一个枚举" VoucherType"

现在我有一个代码,根据条件执行: -

nrow(mydata) == length(fit$cluster)

如果事件类型为" GIVE_AWAY_MONEY_ON_SIGNUP"我必须执行someAction()。 。但我不需要做任何额外的事情,事件类型不是" GIVE_AWAY_MONEY_ON_SIGNUP"。因此,当我调用此代码时,我将voucherType设置为" GIVE_AWAY_MONEY_ON_SIGNUP"并执行someAction()。

但对于任何其他类型的事件,我在if条件中得到空指针异常,因为我从未设置凭证类型,因为我不想做任何特殊的事情。因此,为了避免nullPointerException,我将Voucher代码设置为虚拟(其他voucherType值),我从不在任何条件下使用。我有一种复杂的方法可以消除nullPointerException而不在事件中初始化VoucherType吗?

6 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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);
}

答案 2 :(得分:1)

由WikiBooks定义:

  

当应用程序尝试使用具有null值的对象引用时,抛出NullPointerException。其中包括:在空引用引用的对象上调用实例方法。

如果未实例化枚举值,则其值为null。因此,程序试图引用包含null的对象,该对象抛出NullPointerException

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

答案 3 :(得分:1)

在尝试检查enum.Football的值之前,我会检查枚举是否为空。

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

答案 4 :(得分:1)

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

public enum VoucherType {
    UNDEFINED, 
    GIVE_AWAY_MONEY_ON_SIGNUP,
    //....
    ;
}

将“UNDEFINED”定义为默认值:

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,而是枚举值UNDEFINED。

警告: 很多人宁愿接受NullPointerException而不是上述解决方案,以便在忘记设置voucherType时立即获得反馈。使用上述解决方案会导致忘记设置voucherType并且没有实现它的错误(因为代码不会引发错误)更容易。

此外,它可能会强制您检查某些操作的优惠券类型是否仍然是UNDEFINED,其中要求是将其设置为有意义的值。

我实际上宁愿自己查一下null,但既然你说你想要其他的解决方案,我想我还是会发布这个。

答案 5 :(得分:0)

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

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

对于getVoucherType()方法的空值返回,它永远不会给您NullPointerException。当然,您必须确保事件对象永远不会为空。

或者,正如其中一项注释中所建议的,使用==运算符可以实现枚举:

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