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

Android Studio模拟器运行崩溃问题排查求助

运动推荐应用崩溃问题排查与修复

核心崩溃原因:空指针异常(NullPointerException)

你的代码在启动阶段就会崩溃,因为控件初始化逻辑完全错误:
原代码中你写的是userAge.findViewById(R.id.age);,这是调用一个未初始化的null对象的findViewById方法,直接触发空指针。正确的写法应该是控件变量 = findViewById(Id),所有控件都存在这个问题。

其他潜在崩溃隐患

除了启动崩溃,点击按钮时还可能因为以下问题崩溃:

  • 年龄输入框为空或输入非数字时,Integer.parseInt会抛出NumberFormatException
  • Spinner未选择任何选项时,调用getSelectedItem().toString()会触发空指针
  • 直接用变量调用equals匹配字符串,若变量为空会触发空指针

修复后的完整代码

public class MainActivity extends AppCompatActivity {

    Spinner pregPostWoman, chronicDiseases;
    EditText userAge;
    Button btnrecommend;
    TextView recommendExercise;

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

        // 修复控件初始化:正确给变量赋值
        userAge = findViewById(R.id.age);
        pregPostWoman = findViewById(R.id.pregnantWoman);
        chronicDiseases = findViewById(R.id.croDiseases);
        btnrecommend = findViewById(R.id.btnRecommend);
        recommendExercise = findViewById(R.id.textRecommend);

        ArrayAdapter<CharSequence> adapterPregPostWoman = ArrayAdapter.createFromResource(this, R.array.spinner_choise, android.R.layout.simple_spinner_item);
        adapterPregPostWoman.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        pregPostWoman.setAdapter(adapterPregPostWoman);

        ArrayAdapter<CharSequence> adapterChronicDiseases = ArrayAdapter.createFromResource(this, R.array.spinner_choise, android.R.layout.simple_spinner_item);
        adapterChronicDiseases.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        chronicDiseases.setAdapter(adapterChronicDiseases);

        btnrecommend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 处理年龄输入异常
                String ageStr = userAge.getText().toString().trim();
                if (ageStr.isEmpty()) {
                    recommendExercise.setText("请输入年龄");
                    return;
                }
                int age;
                try {
                    age = Integer.parseInt(ageStr);
                } catch (NumberFormatException e) {
                    recommendExercise.setText("请输入有效的数字年龄");
                    return;
                }

                // 处理Spinner未选中情况
                Object pregItem = pregPostWoman.getSelectedItem();
                Object chronicItem = chronicDiseases.getSelectedItem();
                if (pregItem == null || chronicItem == null) {
                    recommendExercise.setText("请选择完整的状态选项");
                    return;
                }
                String spinnerPregPostWoman = pregItem.toString();
                String spinnerChronicDiseases = chronicItem.toString();

                String recommendation = recommendExercise(age, spinnerPregPostWoman, spinnerChronicDiseases);
                recommendExercise.setText(recommendation);
            }
        });
    }

    private String recommendExercise(int age, String spinnerPregPostWoman, String spinnerChronicDiseases){

        String combination = "";

        if (age >= 5 && age <= 17)
        {
            combination = "每天运动60分钟\n" +
                    "中等至高强度活动或高强度活动(跑步、游泳、骑车、跳绳)\n" +
                    "力量训练(跳绳、俯卧撑、跳舞、攀爬、有氧操)";
        }
        else if (age >= 18 && age <= 64)
        {
            // 用常量在前调用equals,避免空指针
            if("yes".equals(spinnerPregPostWoman))
            {
                combination = "150分钟中等强度活动(快走、双打网球、瑜伽、园艺)\n" +
                        "有氧及力量训练(跳绳、俯卧撑、跳舞、攀爬、有氧操)";
            }
            else if("no".equals(spinnerPregPostWoman))
            {
                if("yes".equals(spinnerChronicDiseases))
                {
                    combination = "进行功能性平衡训练(三面站立、原地踏步、侧步走、坐站平衡)\n" +
                            "每周150-300分钟中等强度有氧活动(快走、双打网球、瑜伽、园艺)\n" +
                            "或75-150分钟高强度有氧活动(跑步、游泳、骑车、跳绳)";
                }
                else if("no".equals(spinnerChronicDiseases))
                {
                    combination = "每周150-300分钟中等强度有氧活动(快走、双打网球、瑜伽、园艺)\n" +
                            "或75-150分钟高强度有氧活动(跑步、游泳、骑车、跳绳)";
                }
                else {
                    combination = "请选择有效的孕产状态选项";
                }
            }
            else {
                combination = "请选择有效的慢性病状态选项";
            }
        }
        else
        {
            combination = "未匹配到合适的运动方案,请调整输入条件";
        }

        return combination;
    }
  
}

额外注意事项

  • 确保res/values/strings.xml中的spinner_choise数组内容与代码匹配:
<string-array name="spinner_choise">
    <item>yes</item>
    <item>no</item>
</string-array>
  • 如果Spinner显示的是中文选项(如"是"/"否"),需同步修改代码中的字符串匹配逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:25:53