【问题标题】:Java static Lists in AndroidAndroid 中的 Java 静态列表
【发布时间】:2014-06-20 03:44:31
【问题描述】:

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

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

【问题讨论】:

  • 为什么它是静态的?
  • 一个大型静态类的c#端口,由所有静态对象组成。我很乐意让它不是静态的,但需要关于如何移植它的帮助
  • 尽量不要使用同名HomePageOptions作为列表和类名
  • 试过了,还是一样的问题。调试器显示了 PharmacyModel.homePageOptions 中包含的内容,这是正确的。
  • 我认为您的问题是您的 HomePageOptions 列表的名称与您的班级名称相同。这不应该是一样的。此外,变量名总是以小写字母开头。

标签: java android list android-listview


【解决方案1】:

这个

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

应该是

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

【讨论】:

  • 当我实现这个时仍然遇到同样的问题
  • 是您的 HomePageOptions POJO 中的公共静态 List homePageOptions 吗?
  • 那你能把PharmacyModel的代码加进去吗?错误可能就埋在那里。
  • 我可以问为什么?。回答时,考虑解释您提供该解决方案的原因,当然,解释一下!
  • 您实际上并没有解释为什么要提供此解决方案。您应该提及诸如它更好,因为...这有效,因为... 之类的内容。此外,您必须记住,您这样做是为了整个社区,也为了不在其中的人,而不仅仅是为了您自己。
【解决方案2】:

类 PharmacyModel 包含公共静态列表 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,listener 为 null 导致问题。该错误在 List 中表现出来,但该 List 或 HomePageOptions 没有任何问题。解决办法是换行

listener.ValueChanged(); 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多