NullPointerExcetion после десериализации Json - PullRequest
1 голос
/ 27 марта 2019

У меня есть приложение для Android, которое сохраняет некоторые данные, когда пользователь нажимает кнопку, эти данные сериализуются в JSON, а затем сохраняются в SharedPreferences через putString.Эти данные можно извлечь из другого действия через Json de-serialization.Журналы говорят мне, что serialization работает правильно, но когда я вызываю мой метод, который возвращает десериализованный объект Json, я получаю NullPointerException.Мой объект (HistoryItem) имеет 2 атрибута: дату и настроение (перечисление, которое может быть грустным, счастливым и т. Д.) С соответствующими получателями и установщиками

Я поместил 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);
    }

затем метод для получения моего объекта 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):

  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() должен вернуть настроение.saveMood2() вызывается при OnLickListener MainActivity.

EDIT: полный стек ошибок:

 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) 

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Просмотр вашей ошибки

Причина: 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 объект.

Может быть, вы забыли это?

Дайте мне знать, если это решит вашу проблему!

0 голосов
/ 27 марта 2019

Кажется, вы пропустили строку, прежде чем запрашивать поля: -

HistoryItem  todayHistoryItem = getMood2(todayDate);
...