java - 使用枚举返回值后出现 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 后得到空对象?
解决方案
我认为枚举不是可包裹的,而是可序列化的。但是,您可以通过实现接口使它们可打包。
我个人会添加代码作为额外的意图,然后在另一边读回来。这是一个很小的有效载荷,你不必实现 parcelable。
推荐阅读
- typescript - 在带有无服务器框架的 AWS Lambda 中将 AWS v3 开发工具包与 Webpack 捆绑在一起?
- postgresql - 如何防止并发函数调用?
- java - 带有 ObjectInputStream 的 EOFException
- javascript - Vue 3 组合 API - 数组的 ref() 与 reactive()
- c++ - 动态分配指向对象的指针数组
- firebase - 使用自定义域的功能进行托管重写不起作用
- java - 骆驼路线未得到识别,在运行应用程序时,启动了 0 条路线中的 0 条
- tensorflow - 为什么 keras 中的 accuracy 和 binary_accuracy 有相同的结果?
- node.js - 当站点项目文件上传到服务器时,如果项目的节点模块通常添加到.gitignore,它们如何仍然工作?
- c++ - 基于策略的设计 - 有条件地使用基类(函数)