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

Android开发RadioButton调用setText()触发NullPointerException问题求助

问题根因
  • 核心触发原因是控件初始化顺序错误:代码中在onCreate方法里先执行了rb_toss_t1.setText()、rb_toss_t2.setText()操作,之后才调用findViewById对这两个RadioButton控件进行实例绑定。调用setText方法时,rb_toss_t1、rb_toss_t2还处于未初始化的null状态,直接触发空指针异常。
  • 同时代码还存在其他潜在空指针风险:如果RadioGroup没有设置默认选中项,getCheckedRadioButtonId()会返回-1,后续通过该id查找控件也会得到null,调用getText()时同样会触发崩溃;另外当前逻辑是在onCreate阶段就获取RadioGroup选中值,用户后续修改选中项后,点击按钮传递的还是初始值,业务逻辑也存在错误。
修复方案

调整控件初始化顺序,所有findViewById操作都放在控件调用之前,同时将获取选中值的逻辑移到按钮点击事件中,补充空值判断,修复后的代码示例如下:

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import com.google.android.material.textfield.TextInputLayout;

public class TeamActivity extends AppCompatActivity {
    private TextInputLayout team1,team2,overs;
    private RadioGroup radioGroup1,radioGroup2;
    private RadioButton rb_toss_t1,rb_toss_t2,rb_opted,rb_tossed;
    private Button begin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_team);
        
        // 先完成所有控件的绑定初始化
        team1 = findViewById(R.id.tv_team1);
        team2 = findViewById(R.id.tv_team2);
        radioGroup1 = findViewById(R.id.radio_toss);
        radioGroup2 = findViewById(R.id.radio_opted);
        rb_toss_t1 = findViewById(R.id.rb_toss_t1);
        rb_toss_t2 = findViewById(R.id.rb_toss_t2);
        overs= findViewById(R.id.tv_overs);
        begin = findViewById(R.id.bttn_begin);

        // 绑定完成后再调用控件方法
        rb_toss_t1.setText(team1.getEditText().getText().toString());
        rb_toss_t2.setText(team2.getEditText().getText().toString());

        begin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 点击按钮时再获取最新的选中值
                int id_toss = radioGroup1.getCheckedRadioButtonId();
                int id_opted = radioGroup2.getCheckedRadioButtonId();
                
                // 补充空值判断,避免崩溃
                if(id_toss == -1 || id_opted == -1){
                    Toast.makeText(TeamActivity.this, "请完成所有选项选择", Toast.LENGTH_SHORT).show();
                    return;
                }
                rb_tossed = radioGroup1.findViewById(id_toss);
                rb_opted = radioGroup2.findViewById(id_opted);
                String toss_team = rb_tossed.getText().toString();
                String opted_team = rb_opted.getText().toString();
                
                Intent i = new Intent(TeamActivity.this,SelectPlayersActivity.class);
                i.putExtra("opted_t",opted_team);
                i.putExtra("toss_t",toss_team);
                i.putExtra("team1",team1.getEditText().getText().toString());
                i.putExtra("team2",team2.getEditText().getText().toString());
                startActivity(i);
                finish();
            }
        });
    }
}

内容的提问来源于stack exchange,提问作者Devesh Parmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:36:03