为什么我在Java中调用enum类的方法时会得到nullpointerexception

时间:2014-01-29 21:39:58

标签: java junit enums nullpointerexception

这是我的简单interfaceenum implements。我写了一个非常简单的JUnit Test case,由于NullPointerException而失败了。我不明白为什么抛出这个Exception。我在测试类中构造了一个enum对象。

public interface Account {
    public String getName();
    public boolean isBillable();
}

public enum NonBillableAccount implements Account {

    SICK_LEAVE("SickLeave"),
    VACATION("Vacation"),
    BUSINESS_DEVELOPMENT("businessDevelopment");
    private String leaveType;

    private NonBillableAccount(String leavetype) {
        this.leaveType = leavetype;
    }

    @Override
    public String getName() {
        return this.leaveType;
    }

    @Override
    public boolean isBillable() {
        return false;
    }

}

此处JUnit test case

public class NonBillableAccountTest {

    Account ac = null;
    @Before
    public void setUp() throws Exception {
        Account ac = NonBillableAccount.BUSINESS_DEVELOPMENT;
    }

    @Test
    public void testGetName() {
        assertEquals(ac.getName(),"businessDevelopment");
    }

    @Test
    public void testIsBillable() {
        assertEquals(ac.isBillable(), false);
    }

}

2 个答案:

答案 0 :(得分:3)

您没有设置总体课程的ac字段。您正在使用新的Account ac变量隐藏它(实际上称为shadowing)。要解决此问题,只需在变量赋值之前删除Account类型名称。

您也可以使用this.ac来引用变量,但只要在引用变量之前没有在本地范围内声明具有相同名称的变量,就没有必要。

答案 1 :(得分:3)

通过使用ac类型修饰符引用Account,如下所示,您将其视为局部变量:

// Create a local variable "ac", does not affect the class variable
Account ac = NonBillableAccount.BUSINESS_DEVELOPMENT;
if (this.ac == null){
   System.println('It does still equal null!'); // yep, it's null
}

尝试使用此选项在测试类上设置ac属性:

// refers to the class variable implicitly
ac = NonBillableAccount.BUSINESS_DEVELOPMENT; 

// refers to the class variable explicitly
this.ac = NonBillableAccount.BUSINESS_DEVELOPMENT; 

这称为“阴影”(explained here),它允许您在不同的上下文中使用相同的变量名称。在您的测试方法中,它会在编译器中将ac扩展为this.ac,当您调用ac.getName()时会抛出NPE,因为您还没有设置类属性。