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
相关产品推荐
相关产品推荐

