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

Android开发新手:使用Intent传递评分触发NullPointerException求助

解决Intent回传数据的NullPointerException问题

嘿,我帮你拆解下你遇到的核心问题,一步步搞定这个崩溃:

问题1:启动MainActivity时的双重错误

你在MainActivity的onCreate里先调用了setTextInTextView(),这里藏了两个坑:

  • 先调用setTextInTextView()再执行setContentView(R.layout.activity_main),这时候布局还没加载,findViewById(R.id.rate)会直接返回null;
  • 第一次启动MainActivity时,根本没有任何Intent附加数据传过来,getIntent().getExtras()会返回null,这时候调用extra.getString("key")必然触发空指针异常。

问题2:Activity2回传数据的方式完全错了

你现在在Activity2里用startActivity(i)启动MainActivity,这其实是新建了一个MainActivity实例,根本不是把数据回传给原来的那个页面。正确的做法是用返回结果的方式传递数据。


修复步骤与代码修改

第一步:修正MainActivity的代码

我们要调整方法调用顺序,加上空值判断,并且用startActivityForResult启动Activity2(兼容绝大多数Android版本):

public class MainActivity extends AppCompatActivity { 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        // 先加载布局,再找控件,这是基础!
        setContentView(R.layout.activity_main); 
        tv = (TextView) findViewById(R.id.rate);
        // 初始化文本,避免空指针
        setTextInTextView();
    } 

    public void setTextInTextView(){ 
        Bundle extra = getIntent().getExtras(); 
        // 先判断extra是否为空,再取值
        if(extra != null){
            tv.setText("当前评分:" + extra.getString("key"));
        } else {
            // 第一次启动时显示默认提示
            tv.setText("暂无评分");
        }
    } 

    public void go(View view) { 
        Intent i = new Intent(MainActivity.this, Activity2.class); 
        // 用startActivityForResult启动,请求码随便设一个,比如100
        startActivityForResult(i, 100); 
    } 

    // 接收Activity2返回的结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 匹配请求码和成功的结果状态
        if(requestCode == 100 && resultCode == RESULT_OK){
            if(data != null){
                String rating = data.getStringExtra("key");
                tv.setText("当前评分:" + rating);
            }
        }
    }
}

第二步:修正Activity2的代码

我们用setResult()返回数据,然后finish()关闭当前页面,回到原来的MainActivity:

public class Activity2 extends AppCompatActivity { 
    RatingBar rb; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_2); 
        rb = (RatingBar) findViewById(R.id.rt); 
    } 

    public void submit(View view) { 
        String st = String.valueOf(rb.getRating()); 
        Intent i = new Intent(); 
        // 把评分数据放到Intent里
        i.putExtra("key", st); 
        // 设置返回结果为成功,并传递Intent
        setResult(RESULT_OK, i); 
        // 关闭当前Activity,回到之前的MainActivity
        finish(); 
    } 
}

为什么这样改?

  • 调整setContentView和findViewById的顺序,确保控件能被正确找到;
  • 增加空值判断,避免第一次启动时因无附加数据导致的崩溃;
  • 用startActivityForResult+setResult的组合,实现数据回传给原MainActivity实例,而不是新建页面。

如果你的项目用的是AndroidX且API版本较高,startActivityForResult已经被废弃,可以改用ActivityResultContracts.StartActivityForResult,不过上面的写法在绝大多数场景下都能正常工作。

内容的提问来源于stack exchange,提问作者ANMOL JAIN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:39:11