Java Json反序列化后的NullPointerExcetion

Java Json反序列化后的NullPointerExcetion,java,android,json,nullpointerexception,gson,Java,Android,Json,Nullpointerexception,Gson,我有一个Android应用程序,当用户点击按钮时会保存一些数据,这些数据被序列化为JSON,然后通过putString保存到SharedReferences中。 这些数据可以通过Json反序列化从其他活动中检索。日志告诉我,serialization运行正常,但当我调用返回反序列化Json对象的方法时,我得到了一个NullPointerException。 我的对象(HistoryItem)有两个属性:一个日期和一个情绪(一个可以悲伤、快乐等的枚举),以及相应的getter和setter 我在序

我有一个Android应用程序,当用户点击按钮时会保存一些数据,这些数据被序列化为JSON,然后通过putString保存到SharedReferences中。 这些数据可以通过Json
反序列化
从其他活动中检索。日志告诉我,
serialization
运行正常,但当我调用返回反序列化Json对象的方法时,我得到了一个
NullPointerException
。 我的对象(HistoryItem)有两个属性:一个日期和一个情绪(一个可以悲伤、快乐等的枚举),以及相应的getter和setter

我在
序列化
反序列化
之前和之后,甚至在创建异常的方法之前的第二个活动中,都将Log.e放在了前面,他们告诉我一切都很好,我肯定没有找对位置

   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);
    }
然后使用方法获取我的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)
displayMood(java:116):

我在这里给displayMood打电话(java:96):

看看你的错误

原因:java.lang.NullPointerException:尝试调用 虚拟方法'com.matt.android.moodtracker_v2.models.MoodEnum com.matt.android.moodtracker_v2.models.HistoryItem.getMood()在 空对象引用

看起来问题在于您正在对
null
对象调用
.getMood()
。这意味着您的
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....
另一点

我在代码中没有看到将
序列化对象
保存到
mPreferences
对象中的任何地方

也许你忘了


如果它解决了您的问题,请告诉我

在查询字段之前,您似乎错过了这一行:-

HistoryItem  todayHistoryItem = getMood2(todayDate);
mPrefs.edit().putString是1 lign bellow^^您的解决方案非常出色!成功了;)
 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) 
//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....
HistoryItem  todayHistoryItem = getMood2(todayDate);