[英]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 放在
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 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.