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

Android点击Variables按钮跳转错误与空指针异常问题求助

问题根因
  • 你观察到的“点击Variables按钮跳转到OverviewActivity”是错觉:实际是VariablesActivity启动时触发崩溃,系统自动回退到Activity栈的前一个界面,因为你Overview页返回时错误新建了HomeActivity实例,栈结构为Home→Overview→Home,Variables崩溃后回退就显示为Overview页,导致你误判跳转逻辑错误。
  • 崩溃的直接原因是VariablesActivity代码逻辑错误:页面刚初始化时RadioGroup默认无选中项,radioGroup.getCheckedRadioButtonId()返回-1,用这个无效id查找控件得到null对象,调用getText()就触发空指针异常。
  • 额外的逻辑缺陷:OverviewActivity点击返回时你调用了startActivity新建HomeActivity实例,而非结束当前Overview页回到原有Home实例,既造成栈冗余,也会导致原有Home页面的状态丢失。

修复方案

1. 修复OverviewActivity返回逻辑

修改OverviewActivity中返回按钮的点击逻辑,不再新建Home实例,通过结果回调给原有Home页传递启用状态:

public class OverviewActivity extends AppCompatActivity {
    public Button backBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overview);
        backBtn = findViewById(R.id.ov_backButton);
        backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 回传结果给上一级HomeActivity
                Intent intent = new Intent();
                intent.putExtra("state", "enable");
                setResult(RESULT_OK, intent);
                // 结束当前Overview页,回到原有Home页
                finish();
            }
        });
    }
}

2. 修复HomeActivity的状态接收逻辑

修改HomeActivity中Overview按钮的启动方式,通过startActivityForResult接收返回的启用状态,移除原有从Intent拿参数的冗余逻辑:

public class HomeActivity extends AppCompatActivity {
    public Button signOutBtn;
    public Button overviewBtn;
    public Button varBtn;
    FirebaseAuth auth;
    boolean overviewDone;
    // 定义请求码用于识别返回结果
    private static final int REQUEST_OVERVIEW = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        signOutBtn = findViewById(R.id.signOutBtn);
        overviewBtn = findViewById(R.id.overviewBtn);
        varBtn = findViewById(R.id.varBtn);
        auth = FirebaseAuth.getInstance();

        overviewDone = false;
        // 初始状态Variables按钮不可用
        varBtn.setEnabled(false);

        signOutBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                auth.signOut();
                startActivity(new Intent(HomeActivity.this, SignInActivity.class));
                finish();
            }
        });

        overviewBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent overviewBtnIntent = new Intent(HomeActivity.this, OverviewActivity.class);
                // 带请求码启动Overview页,等待返回结果
                startActivityForResult(overviewBtnIntent, REQUEST_OVERVIEW);
            }
        });

        varBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent varbiesButtonIntent = new Intent(HomeActivity.this, VariablesActivity.class);
                startActivity(varbiesButtonIntent);
                Log.i("Variable Button", "Going to Variable Activity");
            }
        });
    }

    // 接收Overview页返回的结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_OVERVIEW && resultCode == RESULT_OK) {
            if (data != null && "enable".equals(data.getStringExtra("state"))) {
                overviewDone = true;
                varBtn.setEnabled(true);
            }
        }
    }
}

3. 修复VariablesActivity空指针问题

调整代码逻辑,先判断是否有选中的RadioButton,再获取选中项的值,避免空指针:

public class VariablesActivity extends AppCompatActivity {
    public RadioGroup radioGroup;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_variables);
        radioGroup = findViewById(R.id.RadioGroup);
        // 先获取选中id,判断有效性再取值
        int checkedId = radioGroup.getCheckedRadioButtonId();
        if(checkedId == -1){
            // 无选中项的逻辑
            Log.i("Variable Activity", "当前无选中选项");
        } else{
            String value = ((RadioButton)findViewById(checkedId)).getText().toString();
            Log.i("Radio Button Clicked", value);
        }
        // 如果需要监听用户选中变化,可额外给RadioGroup设置OnCheckedChangeListener
    }
}

内容的提问来源于stack exchange,提问作者Devon Dunham

相关产品推荐
方舟 Agent Plan

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

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