2013-05-18 2 views
0

У меня есть абстрактный класс groovy, который хотел бы иметь атрибут типа Enum. Тем не менее, я не понимаю, как его настроить.Установка свойства класса на значение Enum

меня Это:

abstract class Person { 
protected int heightFeet, heightInches, weight 
protected String firstName, lastName 
protected OccupationType occupation 

protected Person(int hf, hi, w, string fn, string ln, int ocp){ 
     this.heightFeet = hf 
this.heightInches = hi 
this.weight = w 
this.firstName = fn 
this.lastName = ln 
this.occupation.value = ocp 
} 

и Enum выглядит следующим образом:

public enum OccupationType { 
    Teacher(1), Administrator(2), Counselor(3), Doctor(4), Nurse(5), ... 
OccupationsType(int value) {this.value = value} 
private final int value 
public int value() {return value} 
} 

Так что я Типично получить какую-то NullPointerException, что он не может установить значение на нуль объект. Не уверен, что мне не хватает, или если это вообще возможно.

java.lang.NullPointerException: Cannot set property 'value' on null object 
    at org.codehaus.groovy.runtime.NullObject.setProperty(NullObject.java:66) 
    at org.codehaus.groovy.runtime.InvokerHelper.setProperty(InvokerHelper.java:192) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.setProperty(ScriptBytecodeAdapter.java:480) 
    at ***.****.***.****.<init>(**.groovy:30) 
    at ****.***.***.****.<init>(***.groovy:10) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77) 
    at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182) 
    at buchwalter.oldschoolgame.characters.FighterTest.getFullConcrete(FighterTest.groovy:18) 
    at buchwalter.oldschoolgame.characters.PlayerTest.shouldReturnGenderType(PlayerTest.groovy:114) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
+0

Поделитесь своим кодом, который выбрасывает нулевой указатель – Will

ответ

0

Проблема в вашем конструкторе Person. Вы не можете установить атрибут перечисления. Вы просто передаете объект перечисления в конструктор ИЛИ вы передаете целочисленный атрибут value и find объект перечисления, который имеет это значение. Я очищено ваш пример, но он должен работать, когда вы добавляете остальные параметры конструктора:

// this won't work because 'this.occupation' IS null 
protected Person(int ocp) { 
    this.occupation.value = ocp 
} 

Так как передать объект перечисления:

protected Person(OccupationType type) { 
    this.occupation = type 
} 

ИЛИ получить атрибут Int и find это:

protected Person(int ocp) { 
    this.occupation = OccupationType.find { it.value == ocp } 
}