Android中的Java静态列表

时间:2014-06-20 03:44:31

标签: java android list android-listview

我在模型类中有一个静态列表:

public static List<HomePageOptions> homePageOptions = Arrays.asList(
    new HomePageOptions("Title1_1", "Title2_1"),
    new HomePageOptions("Title1_2!", "Title2_2"),
    new HomePageOptions("Title1_3", "Title2_3"),
    new HomePageOptions("Title1_4", "Title2_4")
);

定义HomePageOptions:

public class HomePageOptions
{
    String Title1;
    String Title2;

public HomePageOptions (String title1, String title2)
{
    setTitle1(title1);
    setTitle2(title2);
}

//regular setters and getters
}

我有一个以这样开放的活动:

 @Override
 protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_home);


    List<String> values = new ArrayList<String>();

    for(HomePageOptions ho : PharmacyModel.homePageOptions){
        values.add(ho.getTitle1());
    }
 }

for循环给我一个ExceptionInInitializationError。当我在for循环之前创建一个常规List时,我没有遇到任何问题,但我想将此结构保留在模型类中。我一直试图找到解决方案,为什么会这样。我的猜测是List homePageOptions上的静态修饰符。有人可以帮忙吗?

这是调试器所说的内容

Thread [<1> main] (Suspended (exception ExceptionInInitializerError))   
<VM does not provide monitor information>   
HomeActivity.onCreate(Bundle) line: 33  
HomeActivity(Activity).performCreate(Bundle) line: 4465 
Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1049   
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 1920    
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 1981 
ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 123    
ActivityThread$H.handleMessage(Message) line: 1147  
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 137 
ActivityThread.main(String[]) line: 4424    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 511  
ZygoteInit$MethodAndArgsCaller.run() line: 784  
ZygoteInit.main(String[]) line: 551 
NativeStart.main(String[]) line: not available [native method]  

和LogCat

06-20 04:08:06.274: E/AndroidRuntime(1580): FATAL EXCEPTION: main
06-20 04:08:06.274: E/AndroidRuntime(1580): java.lang.ExceptionInInitializerError
06-20 04:08:06.274: E/AndroidRuntime(1580):     at com.allgoodpeopleus.rootsoflife.HomeActivity.onCreate(HomeActivity.java:24)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.app.Activity.performCreate(Activity.java:4465)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.os.Looper.loop(Looper.java:137)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at android.app.ActivityThread.main(ActivityThread.java:4424)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at java.lang.reflect.Method.invokeNative(Native Method)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at java.lang.reflect.Method.invoke(Method.java:511)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at dalvik.system.NativeStart.main(Native Method)
06-20 04:08:06.274: E/AndroidRuntime(1580): Caused by: java.lang.NullPointerException
06-20 04:08:06.274: E/AndroidRuntime(1580):     at ROLModel.Parameter.setValue(Parameter.java:91)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at ROLModel.Parameter.<init>(Parameter.java:21)
06-20 04:08:06.274: E/AndroidRuntime(1580):     at ROLModel.PharmacyModel.<clinit>(PharmacyModel.java:77)
06-20 04:08:06.274: E/AndroidRuntime(1580):     ... 15 more

2 个答案:

答案 0 :(得分:0)

public HomePageOptions (String title1, String title2)
{
    setTitle1(title1);
    setTitle2(title2);
}

应该是

public HomePageOptions (String title1, String title2) {
    Title1 = title1;
    Title2 = title2;
}

答案 1 :(得分:0)

PharmacyModel类包含公共静态List homePageOptions。在类的其他地方,我有几个类参数的实例:

public static Parameter Age = new Parameter("Age", 30, "years");

,其中

public class Parameter {

public Object Value;

public Parameter(String name, Object defaultValue, String units) {
    setValue(defaultValue);
    //set others
}

ParameterChangedEvent listener;
public void addListener(ParameterChangedEvent event){
    listener = event;
}

public void setValue(Object value) {
    Value = value;  

    listener.ValueChanged();
}

因为在构造函数中调用setValue,所以侦听器为null导致问题。该错误在List中表现出来,但该List或HomePageOptions没有任何问题。解决方案是改为行

listener.ValueChanged(); 

if(listener != null) listener.ValueChanged();