You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}

问题原因及修复方案

核心问题

  1. super.onBackPressed()调用时机错误:调用super.onBackPressed()时,系统已默认处理返回操作并finish当前Activity,后续setResult()代码根本不会执行,导致MainActivity收到的data为null,触发空指针异常。
  2. MainActivity未做空值校验:直接调用data.getExtras(),未判断data是否为null、resultCode是否为RESULT_OK,存在崩溃风险。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:27:36