RecyclerView Adapter启动Activity返回后,MainActivity获取Extras空指针异常
问题:从CoursePage返回MainActivity时出现空对象引用异常
我在RecyclerView的Adapter中启动了CoursePage Activity,当该Activity结束后,尝试在MainActivity中获取返回的变量,但出现了空对象引用异常。
报错日志
2022-07-22 13:37:36.758 17186-17186/com.bs03.zerothree E/AndroidRuntime: FATAL EXCEPTION: main Process: com.bs03.zerothree, PID: 17186 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.bs03.zerothree/com.bs03.zerothree.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference at android.app.ActivityThread.deliverResults(Unknown Source:123) at android.app.ActivityThread.handleSendResult(Unknown Source:146) at android.app.servertransaction.ActivityResultItem.execute(Unknown Source:11) at android.app.servertransaction.ActivityTransactionItem.execute(Unknown Source:4) at android.app.servertransaction.TransactionExecutor.executeCallbacks(Unknown Source:77) at android.app.servertransaction.TransactionExecutor.execute(Unknown Source:73) at android.app.ActivityThread$H.handleMessage(Unknown Source:127) at android.os.Handler.dispatchMessage(Unknown Source:19) at android.os.Looper.loopOnce(Unknown Source:176) at android.os.Looper.loop(Unknown Source:76) at android.app.ActivityThread.main(Unknown Source:138) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:11) at com.android.internal.os.ZygoteInit.main(Unknown Source:309) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference at com.bs03.zerothree.MainActivity.onActivityResult(MainActivity.java:277) at android.app.Activity.dispatchActivityResult(Unknown Source:11) at android.app.ActivityThread.deliverResults(Unknown Source:56) at android.app.ActivityThread.handleSendResult(Unknown Source:146) at android.app.servertransaction.ActivityResultItem.execute(Unknown Source:11) at android.app.servertransaction.ActivityTransactionItem.execute(Unknown Source:4) at android.app.servertransaction.TransactionExecutor.executeCallbacks(Unknown Source:77) at android.app.servertransaction.TransactionExecutor.execute(Unknown Source:73) at android.app.ActivityThread$H.handleMessage(Unknown Source:127) at android.os.Handler.dispatchMessage(Unknown Source:19) at android.os.Looper.loopOnce(Unknown Source:176) at android.os.Looper.loop(Unknown Source:76) at android.app.ActivityThread.main(Unknown Source:138) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:11) at com.android.internal.os.ZygoteInit.main(Unknown Source:309)
相关代码
MainActivity代码
public final static int REQUEST_CODE_C = 2; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQUEST_CODE_C: int course_id = data.getExtras().getInt("courseId"); boolean completeStatus = data.getExtras().getBoolean("courseCompleteStatus"); courseList.get(course_id).setCompleteStatus(completeStatus); fullCoursesList.clear(); fullCoursesList.addAll(courseList); courseAdapter.notifyDataSetChanged(); break; } }
CourseAdapter代码
public void onClick(View v) { Intent intent = new Intent(context, CoursePage.class); ((Activity) context).startActivityForResult(intent, REQUEST_CODE_C); }
CoursePage代码
public void onBackPressed() { super.onBackPressed(); int courseId = getIntent().getIntExtra("courseId", -1); boolean completeStatus = getIntent().getBooleanExtra("completeStatus", false); Intent resultIntent = new Intent(); resultIntent.putExtra("courseId",courseId); resultIntent.putExtra("courseCompleteStatus",completeStatus); int course_id1 = resultIntent.getExtras().getInt("courseId"); boolean completeStatus1 = resultIntent.getExtras().getBoolean("courseCompleteStatus"); setResult(CoursePage.RESULT_OK, resultIntent); finish(); }
问题原因及修复方案
核心问题
super.onBackPressed()调用时机错误:调用super.onBackPressed()时,系统已默认处理返回操作并finish当前Activity,后续setResult()代码根本不会执行,导致MainActivity收到的data为null,触发空指针异常。- MainActivity未做空值校验:直接调用
data.getExtras(),未判断data是否为null、resultCode是否为RESULT_OK,存在崩溃风险。 - CourseAdapter未传递必要数据:启动CoursePage的Intent没有携带
courseId和completeStatus,导致CoursePage获取到的是默认无效值。
修复步骤
1. 调整CoursePage的onBackPressed方法
将super.onBackPressed()移到最后,确保先设置返回结果再执行返回操作:
@Override public void onBackPressed() { // 获取需要返回的数据 int courseId = getIntent().getIntExtra("courseId", -1); boolean completeStatus = getIntent().getBooleanExtra("completeStatus", false); // 构建返回Intent并设置数据 Intent resultIntent = new Intent(); resultIntent.putExtra("courseId", courseId); resultIntent.putExtra("courseCompleteStatus", completeStatus); // 设置返回结果 setResult(RESULT_OK, resultIntent); // 最后执行系统默认的返回操作 super.onBackPressed(); }
2. 完善MainActivity的onActivityResult方法
增加空值和结果码校验,避免空指针:
public final static int REQUEST_CODE_C = 2; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQUEST_CODE_C: // 判断结果是否成功且数据不为null if (resultCode == RESULT_OK && data != null) { int course_id = data.getIntExtra("courseId", -1); // 校验course_id有效性,避免数组越界 if (course_id != -1 && course_id < courseList.size()) { boolean completeStatus = data.getBooleanExtra("courseCompleteStatus", false); courseList.get(course_id).setCompleteStatus(completeStatus); fullCoursesList.clear(); fullCoursesList.addAll(courseList); courseAdapter.notifyDataSetChanged(); } } break; } }
3. 补充CourseAdapter的数据传递
在启动CoursePage时,传递当前item的courseId和completeStatus:
public void onClick(View v) { // 获取当前点击item对应的课程数据 Course course = courseList.get(getAdapterPosition()); Intent intent = new Intent(context, CoursePage.class); intent.putExtra("courseId", course.getId()); intent.putExtra("completeStatus", course.isCompleteStatus()); ((Activity) context).startActivityForResult(intent, REQUEST_CODE_C); }
内容的提问来源于stack exchange,提问作者riabchun
相关产品推荐
相关产品推荐

