简体   繁体   English

Json 反序列化后的 NullPointerExcetion

[英]NullPointerExcetion after Json deserialisation

I have an Android App who save some data when user click on a button, those data is serialized to JSON then saved into SharedPreferences via putString.我有一个 Android 应用程序,它在用户单击按钮时保存一些数据,这些数据被序列化为 JSON,然后通过 putString 保存到 SharedPreferences 中。 Those data are retrievable from another activity via Json de-serialization .这些数据可以通过 Json de-serialization从另一个活动中检索。 Logs tell me that serialization is doing correctly but when i call my method who return de-serialized Json Object I've got a NullPointerException .日志告诉我serialization是正确的,但是当我调用返回反序列化的 Json 对象的方法时,我得到了一个NullPointerException My Object (HistoryItem) have 2 attributs : a Date and a Mood.(an enum who can be sad, happy, etc) with corresponding getters and setters我的对象 (HistoryItem) 有 2 个属性:一个日期和一个心情。(一个可以悲伤、快乐等的枚举)以及相应的 getter 和 setter

I've put Log.e at Serialization , de-serialization , before and after, even in my second activity just before the method who create exception, and they tell me that everything is doing well, i'm surely not looking at the right place...我已经把 Log.e 放在Serializationde-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 method to get my HistoryItem Object 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;
}

Exception :例外 :

   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: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....

I'm calling displayMood here (java :96):我在这里调用 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() is supposed to return a Mood. todayHistoryItem.getMood()应该返回一个心情。 saveMood2() is called at OnLickListener of MainActivity. saveMood2()在 MainActivity 的OnLickListener中被调用。

EDIT: full error stack :编辑:完整的错误堆栈:

 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) 

Looking at your error看着你的错误

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引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法'com.matt.android.moodtracker_v2.models.MoodEnum com.matt.android.moodtracker_v2.models.HistoryItem.getMood()'

Looks like the problem is that you are calling .getMood() on a null object.看起来问题在于您在null对象上调用.getMood() This means that your todayHistoryItem is null.这意味着您的todayHistoryItem为空。

You should probably edit your code to be like that:您可能应该将代码编辑为这样:

//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....

Another point还有一点

I don't see anywhere in your code where you are saving your serialized object into your mPreferences object.我在您的代码中没有看到您将serialized object保存到mPreferences对象的任何地方。

Maybe you forgot it?也许你忘记了?

Let me know if it fixes your problem!如果它解决了您的问题,请告诉我!

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

HistoryItem  todayHistoryItem = getMood2(todayDate);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM