【问题标题】:java.lang.ExceptionInInitializerError in enum with multiple values具有多个值的枚举中的 java.lang.ExceptionInInitializerError
【发布时间】:2016-01-24 04:06:27
【问题描述】:

这是枚举的代码(在单例类内部):

public class GlobalStore extends Application{
.....
......
.....
public synchronized static GlobalStore getInstance() {
    if(instance==null){
        instance = new GlobalStore();
    }
    return instance;
}

.....
......

public static enum Category {
    CATEGORIA_DB(1,instance.getString(R.string.cat_dep_bel),"db"),
    CATEGORIA_EL(2,instance.getString(R.string.cat_edu_lec),"el"),
    CATEGORIA_E(3,instance.getString(R.string.cat_entre),"e"),
    CATEGORIA_EM(4,instance.getString(R.string.cat_est_mod),"em"),
    CATEGORIA_GV(5,instance.getString(R.string.cat_gas_vinos),"gv"),
    CATEGORIA_DH(6,instance.getString(R.string.cat_dis_hog),"dh"),
    CATEGORIA_S(7,instance.getString(R.string.cat_salud),"s"),
    CATEGORIA_ST(8,instance.getString(R.string.cat_ser_tec),"st"),
    CATEGORIA_T(9,instance.getString(R.string.cat_turis),"t"),
    CATEGORIA_AC(10,instance.getString(R.string.cat_arte_cultura),"ac");


    private final int id;
    private final String gloss;
    private final String code;

    Category(int mId, String mGloss, String mCode) {
        this.id = mId;
        this.gloss = mGloss;
        this.code = mCode;
    }

    public int getId() {
        return id;
    }

    public String getGloss() {
        return gloss;
    }

    public String getImagen() {
        return "icon_"+code;
    }

    public String getSelectedImagen() {
        return this.getImagen() + "_red";
    }

    public String getDrawString() {
        return "mn_"+code+"1";
    }

}

以及这一行的错误:

public static Category findCategoryById(int mId) {

    for (Category categoria : Category.values()) { //HERE is error in Category.values() -- line 327
        if (categoria.getId()==mId) {
            return categoria;
        }
    }
    return null;
}

.....
}

更新

logcat 中的错误:

01-24 05:42:49.310 31800-31800/? E/AndroidRuntime: FATAL EXCEPTION: main
01-24 05:42:49.310 31800-31800/? E/AndroidRuntime: Process: com.assertsoft.beneplus.alpha, PID: 31800
01-24 05:42:49.310 31800-31800/? E/AndroidRuntime: java.lang.ExceptionInInitializerError
01-24 05:42:49.310 31800-31800/? E/AndroidRuntime:     at com.assertsoft.model.GlobalStore.findCategoriaById(GlobalStore.java:327)
01-24 05:42:49.310 31800-31800/? E/AndroidRuntime:     at com.assertsoft.adapters.ListaCuponesAdapter.getView(ListaCuponesAdapter.java:196)

【问题讨论】:

  • 你能分享堆栈跟踪吗
  • 'instance' 必须为空,getInstance() 被调用了吗?
  • @IanMc getInstance 已被调用: String stringDrawable = "R.drawable."+ GlobalStore.getInstance().findCategoriaById(item.getId_categoria()).getDrawString(); int resId = context.getResources().getIdentifier(stringDrawable, "drawable", context.getPackageName());
  • R.string.cat_* 有没有可能没有定义?
  • @IanMc 已定义...我找到了解决方案,见下文。非常感谢

标签: java android enums


【解决方案1】:

我相信你的代码:

Category(int mId, String mGloss, String mCode) {
        this.id = mId;
        this.gloss = mGloss;
        this.code = mCode;
    }

期望初始化三个值。但是这一行:

public static Category findCategoryById(int mId)

正在初始化其中的一个。在该静态上下文中,所有参数都需要初始化。

【讨论】:

  • findCategoryById 需要抛出所有枚举值,然后 Category.values() 在尝试初始化时失败...但我不知道在这种情况下它是如何正确初始化的
【解决方案2】:

问题是 CATEGORIA_XX(N,instance.getString(R.string.cat_mmm),"YY")

getString 活动需要解释 getString。

CATEGORIA_XX(N,ActivityInstance.getString(R.string.cat_mmm),"YY")

效果很好!

非常感谢大家。

【讨论】:

    猜你喜欢
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多