Android 每当试图保存SharedReference时,应用程序就会崩溃
我有一个应用程序,在我按下两个按钮中的一个之前运行良好,这两个按钮都将我当前的自定义类保存为JSON文件,其中存储了四个Android 每当试图保存SharedReference时,应用程序就会崩溃,android,json,android-sharedpreferences,gson,Android,Json,Android Sharedpreferences,Gson,我有一个应用程序,在我按下两个按钮中的一个之前运行良好,这两个按钮都将我当前的自定义类保存为JSON文件,其中存储了四个ArrayList 下面是我在SharedReferences中加载和保存JSON文件的代码: @Override protected void onResume() { super.onResume(); SharedPreferences myPrefs = getPreferences(MODE_PRIVATE); Gson gson = new
ArrayList
下面是我在SharedReferences中加载和保存JSON文件的代码:
@Override
protected void onResume() {
super.onResume();
SharedPreferences myPrefs = getPreferences(MODE_PRIVATE);
Gson gson = new Gson();
String json = myPrefs.getString("MyObject", "");
StudentArray obj = gson.fromJson(json, StudentArray.class);
studentsFirstNames = obj.studentFirstName;
studentsLastNames = obj.studentLastName;
studentsCourses = obj.studentCourse;
studentsYearsOfStudy = obj.studentYearOfStudy;
}
@Override
protected void onPause() {
super.onPause();
SharedPreferences myPrefs = getPreferences(MODE_PRIVATE);
Editor prefsEditor = myPrefs.edit();
Gson gson = new Gson();
StudentArray example = new StudentArray(studentsFirstNames, studentsLastNames, studentsCourses, studentsYearsOfStudy);
String json = gson.toJson(example);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
}
Logcat碰撞日志
04-26 21:58:38.985 14971-14971/com.adam_smedley.moduleenrollment E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.adam_smedley.moduleenrollment, PID: 14971
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=0, data=null} to activity {com.adam_smedley.moduleenrollment/com.adam_smedley.moduleenrollment.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4089)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:344)
at android.widget.ListView.setAdapter(ListView.java:493)
at com.adam_smedley.moduleenrollment.MainActivity.onActivityResult(MainActivity.java:89)
at android.app.Activity.dispatchActivityResult(Activity.java:6932)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4085)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
好的,看来我的ArrayList是空对象引用,因为我无法向它们添加其他字符串或get.size()
有人看到下面的声明有什么问题吗
static ArrayList<String> studentsFirstNames;
studentsFirstNames = new ArrayList<String>();
studentsFirstNames.add("John");
它应该访问主活动中的静态ArrayList studentsFirstNames,并向ArrayList添加一个字符串firstName
onActivityResult代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ListAdapter enrollmentAdapter = new CustomAdapter(this, studentsFirstNames, studentsLastNames, studentsCourses, studentsYearsOfStudy);
ListView studentsListView = (ListView) findViewById(R.id.StudentsListView);
studentsListView.setAdapter(enrollmentAdapter);
}
这肯定是由上面的onResume()和onPause()代码引起的,因为我已经注释掉了它,我的应用程序可以工作,但它没有保存任何内容,所以我没有任何数据持久性 在你的
onResume
方法中,你很可能得到无效的StudentArray
。因此,在使用gson获取对象时,需要检查null或异常。大概是这样的:
@Override
protected void onResume() {
super.onResume();
SharedPreferences myPrefs = getPreferences(MODE_PRIVATE);
Gson gson = new Gson();
String json = myPrefs.getString("MyObject", "");
try {
StudentArray obj = gson.fromJson(json, StudentArray.class);
if (obj != null) {
studentsFirstNames = obj.studentFirstName;
studentsLastNames = obj.studentLastName;
studentsCourses = obj.studentCourse;
studentsYearsOfStudy = obj.studentYearOfStudy;
} else {
// obj is null. You need to do something here.
}
} catch (IllegalStateException | JsonSyntaxException exception) {
// there is something wrong when parsing the json
// do something
}
}
如果您不介意的话,您可以只在完成rollment和saveEnrollment时发布所涉及的代码。只需编辑问题。否则,您可能永远得不到任何帮助。您的inActivityResult代码在哪里,这就是崩溃发生的地方,您可以共享它吗?@MidasLefko onActivityResult代码?您不应该从其他活动访问
studentsFirstNames
。您需要在onActivityResult
中处理add
AddNewStudent
activity不知道主活动在做什么。根据堆栈跟踪,以下列表之一在onActivityResult中为空:studentsFirstNames、studentsLastNames、studentsScorses、studentsYearsOfStudy。你应该进行调试,找出我认为是哪种情况,以及为什么会是这种情况。在Logcat中,我在尝试获取null对象引用上的“int java.util.List.size()”时遇到了一个致命的异常。我自己没有任何.size()调用,所以当其他活动完成时,onResume函数是否完成了某些操作?
@Override
protected void onResume() {
super.onResume();
SharedPreferences myPrefs = getPreferences(MODE_PRIVATE);
Gson gson = new Gson();
String json = myPrefs.getString("MyObject", "");
try {
StudentArray obj = gson.fromJson(json, StudentArray.class);
if (obj != null) {
studentsFirstNames = obj.studentFirstName;
studentsLastNames = obj.studentLastName;
studentsCourses = obj.studentCourse;
studentsYearsOfStudy = obj.studentYearOfStudy;
} else {
// obj is null. You need to do something here.
}
} catch (IllegalStateException | JsonSyntaxException exception) {
// there is something wrong when parsing the json
// do something
}
}