java - Json 反序列化后的 NullPointerExcetion
问题描述
我有一个 Android 应用程序,它在用户单击按钮时保存一些数据,这些数据被序列化为 JSON,然后通过 putString 保存到 SharedPreferences 中。这些数据可以通过 Json 从另一个活动中检索de-serialization
。日志告诉我这样serialization
做是正确的,但是当我调用返回反序列化 Json 对象的方法时,我得到了一个NullPointerException
. 我的对象(HistoryItem)有 2 个属性:一个日期和一个心情。(一个可以悲伤、快乐等的枚举)以及相应的 getter 和 setter
我已经把 Log.e 放在Serialization
, de-serialization
, 之前和之后,甚至在我的第二个活动中,就在创建异常的方法之前,他们告诉我一切都很好,我肯定没有找对地方......
public void savemood2(Date date, HistoryItem historyItem) {
Gson gson = new Gson();
String jsonHistoryItem;
// HistoryItem --> Json String
if (historyItem.getComment() != null || historyItem.getComment() != PREF_KEY_EMPTY_COMMENT) {
jsonHistoryItem = gson.toJson(historyItem, HistoryItem.class);
}
//If there's no comment, save PREF_KEY_EMPTY_COMMENT as comment
else {
historyItem.setComment(PREF_KEY_EMPTY_COMMENT);
jsonHistoryItem = gson.toJson(historyItem, HistoryItem.class);
}
then 方法来获取我的 HistoryItem 对象
public HistoryItem getMood2(Date date) {
Gson gson = new Gson();
String json = mPreferences.getString(getMoodDate(date), null);
historyItem = gson.fromJson(json, HistoryItem.class);
Log.e("TAGOUTPUT", json);
return historyItem;
}
例外 :
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.matt.android.moodtracker_v2.models.MoodEnum com.matt.android.moodtracker_v2.models.HistoryItem.getMood()' on a null object reference
at com.matt.android.moodtracker_v2.controllers.MoodHistoryActivity.displayMood(MoodHistoryActivity.java:116)
at com.matt.android.moodtracker_v2.controllers.MoodHistoryActivity.onCreate(MoodHistoryActivity.java:96)
显示情绪(java:116):
if (todayHistoryItem.getMood() == null) {
relativeLayout.setBackgroundColor(0);
} else {
// Set background color and fraction for each mood case
switch (todayHistoryItem.getMood()) {
case Sad:
relativeLayout.setLayoutParams(new LinearLayout.LayoutParams(width / 5,
LinearLayout.LayoutParams.MATCH_PARENT, 1));
relativeLayout.setBackgroundColor(getResources().getColor(R.color.faded_red));
break;
case Disappointed: etc....
我在这里调用 displayMood (java :96):
// Loop to display last 7 moods
Calendar calendar = Calendar.getInstance();
for (int i = 0; i < 7; i++) {
calendar.add(Calendar.DAY_OF_WEEK, -1); //Subtract one day from calendar (yesterday)
this.displayMood(calendar.getTime(), layouts[i]);
this.displayComment(calendar.getTime(), buttons[i]);
}
todayHistoryItem.getMood()
应该返回一个心情。
在MainActivitysaveMood2()
中调用。OnLickListener
编辑:完整的错误堆栈:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matt.android.moodtracker_v2/com.matt.android.moodtracker_v2.controllers.MoodHistoryActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.matt.android.moodtracker_v2.models.MoodEnum com.matt.android.moodtracker_v2.models.HistoryItem.getMood()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2721)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2782)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1521)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6228)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.matt.android.moodtracker_v2.models.MoodEnum com.matt.android.moodtracker_v2.models.HistoryItem.getMood()' on a null object reference
at com.matt.android.moodtracker_v2.controllers.MoodHistoryActivity.displayMood(MoodHistoryActivity.java:116)
at com.matt.android.moodtracker_v2.controllers.MoodHistoryActivity.onCreate(MoodHistoryActivity.java:96)
at android.app.Activity.performCreate(Activity.java:6860)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2674)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2782)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1521)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6228)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
解决方案
看着你的错误
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'com.matt.android.moodtracker_v2.models.MoodEnum com.matt.android.moodtracker_v2.models.HistoryItem.getMood()'
看起来问题在于您正在调用.getMood()
一个null
对象。这意味着您的todayHistoryItem
为空。
您可能应该将代码编辑为:
//add todayHistoryItem == null check
if (todayHistoryItem == null || todayHistoryItem.getMood() == null) {
relativeLayout.setBackgroundColor(0);
} else {
// Set background color and fraction for each mood case
switch (todayHistoryItem.getMood()) {
case Sad:
relativeLayout.setLayoutParams(new LinearLayout.LayoutParams(width / 5,
LinearLayout.LayoutParams.MATCH_PARENT, 1));
relativeLayout.setBackgroundColor(getResources().getColor(R.color.faded_red));
break;
case Disappointed: etc....
另一点
我在您的代码中没有看到您将您保存serialized object
到mPreferences
对象中的任何地方。
也许你忘记了?
让我知道它是否能解决您的问题!
推荐阅读
- azure - 个人 MS 帐户的 Azure 应用注册,无需添加外部用户
- c# - UDP Socket不会在android上接收数据
- python - Zeep 给出的错误查询请求太大。我必须拉〜100K记录
- flutter - Dart HTTP 请求列表
- java - 从运行在 tomcat 上的基于 spring 的应用程序中删除 JNDI 数据源配置
- hadoop - Hive SQL 文件执行
- javascript - 如果需要 Google 的 Pub/Sub 库,包裹会崩溃
- vue.js - Vuetify.js - 如何让同一行上的卡片填满所有可用的垂直空间?
- mysql - 将 3 个查询合二为一
- html - 当我使用 wicked_pdf gem 时,它会重定向到查看页面而不是下载选项