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

