首页 > 解决方案 > 使用枚举返回值后出现 NullPointerException

问题描述

我的转换器类:

public class CategoriesConverter extends Item_get {
    @TypeConverter
    public static Item_get.Food_type toFood_type(int food_type){
        if(food_type == SWEETS.getCode()){
            return SWEETS;
        }else if(food_type == DRINKS.getCode()){
            return DRINKS;
        }else if(food_type == OTHER.getCode()){
            return OTHER;
        }else {
            throw new IllegalArgumentException("Error Status");
        }
    }

    @TypeConverter
    public static int toInt(Item_get.Food_type food_type){
        return food_type.getCode();
    }
}

在我Recyclerview单击编辑图像时,我将下一个活动数据放在这样的位置:

@Override
public void onEditClick(Item_get item_get) {
    Intent intent = new Intent(getActivity(), Edit_Delete_details.class);
    intent.putExtra("KEY1", item_get);
    intent.putExtra(Edit_Delete_details.EXTRA_ID, item_get.getId());
    start_next_activity.launch(intent);
}

在第二个活动中,我这样做:

intent = getIntent();
item_get = intent.getParcelableExtra("KEY1");
id = intent.getIntExtra(EXTRA_ID, default: -1);
name = item_get.getName_Product();
amount = item_get.getAmount();
Item_get.Food_type food_type = item_get.food_type.getCode();

上面的行food_type总是返回null,我不知道为什么,因为在第一次活动中这样的东西很好用:

String f = String.valueOf(item_get.food_type); <-- Return String representation of enum like: SWEETS
OR 
int n = item_get.food_type.getCode(); <-- Return integer of actually selected enum category like: 1

当我这样做时:

int n = item_get.food_type.getCode();
intent.putExtra("LINK", n);

它运作良好。我在活动 2 中有它。

但是为什么我不能用整个 item_get 对象发送它?就像 Name Product 和 Amount 一样,我必须把它放到第二个变量中?

问题是当我想将数据从活动 2 发送回活动 1 时,我收到如下错误:

引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int com.example.project.Item_get$Food_type.getCode()”

当我更改 CategoriesConverter 类时:

@TypeConverter
public static int toInt(Item_get.Food_type food_type){
    From
    return food_type.getCode();
    to
    return 1;
}

不会发生错误(这不是解决方案),但可能是提示。

我的 Item_get.class 有这样的枚举

public enum Food_type{
    SWEETS(1),
    DRINKS(2),
    OTHER(3);
    private int code;
    Food_type(int code){
        this.code = code;
    }
    public int getCode(){
        return code;
    }
}

我还添加@TypeConverters了数据库。
我读过枚举是包裹对象。
我正在使用RoomDatabase
那么为什么我在从活动 1 更改为活动 2 后得到空对象?

标签: javaandroidandroid-room

解决方案


我认为枚举不是可包裹的,而是可序列化的。但是,您可以通过实现接口使它们可打包。

我个人会添加代码作为额外的意图,然后在另一边读回来。这是一个很小的有效载荷,你不必实现 parcelable。


推荐阅读