Android空EditText点击Button崩溃问题求助
问题描述
我是Android编程新手,有7个需要输入double类型值的EditText,当至少一个EditText未输入内容时点击Button,应用就崩溃;全部输入有效值时运行正常。试过用Toast提示错误、添加if-else判断,但都没效果。以下是原MainActivity代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void baslat (View view) { TableLayout resultLayout = findViewById(R.id.resultLayout); resultLayout.setVisibility(View.VISIBLE); // 隐藏键盘 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(resultLayout.getWindowToken(), 0); // 设置小数位数 NumberFormat sonUmut = NumberFormat.getNumberInstance(); sonUmut.setMaximumFractionDigits(3); // T1 目标计算 EditText t1 = findViewById(R.id.t1); EditText yapilan = findViewById(R.id.yapilan); EditText ayGun = findViewById(R.id.ayGun); EditText bugun = findViewById(R.id.bugun); TextView t1Sonuc = findViewById(R.id.t1Sonuc); double t1Veri = Double.parseDouble(t1.getText().toString()); double yapilanVeri = Double.parseDouble(yapilan.getText().toString()); // 多用途 double ayGunVeri = Double.parseDouble(ayGun.getText().toString()); // 多用途 double bugunVeri = Double.parseDouble(bugun.getText().toString()); // 多用途 double t1Formul = (t1Veri - yapilanVeri) / (ayGunVeri - bugunVeri); String t1Formula = sonUmut.format(t1Formul); t1Sonuc.setText(""+t1Formula+""); // T2 目标计算 EditText t2 = findViewById(R.id.t2); TextView t2Sonuc = findViewById(R.id.t2Sonuc); double t2Veri = Double.parseDouble(t2.getText().toString()); double t2Formul = (t2Veri - yapilanVeri) / (ayGunVeri - bugunVeri); String t2Formula = sonUmut.format(t2Formul); t2Sonuc.setText(""+t2Formula+""); // 数量目标计算 EditText adet = findViewById(R.id.adet); TextView adetSonuc = findViewById(R.id.adetSonuc); double adetVeri = Double.parseDouble(adet.getText().toString()); double adetFormul = t2Formul / (yapilanVeri / adetVeri); String adetFormula = sonUmut.format(adetFormul); adetSonuc.setText(""+adetFormula+""); // TL 效率计算 EditText saat = findViewById(R.id.saat); TextView tlVerimSonuc = findViewById(R.id.tlVerimSonuc); double saatVeri = Double.parseDouble(saat.getText().toString()); double tlVerimFormul = (t2Formul / saatVeri); String tlVerimFormula = sonUmut.format(tlVerimFormul); tlVerimSonuc.setText(""+tlVerimFormula+""); // 数量效率计算 TextView adetVerimSonuc = findViewById(R.id.adetVerimSonuc); double adetVerimFormul = (adetFormul / saatVeri); String adetVerimFormula = sonUmut.format(adetVerimFormul); adetVerimSonuc.setText(""+adetVerimFormula+""); // T1 完成率计算 TextView t1TamamlananSonuc = findViewById(R.id.t1Tam); double t1TamFormul = (yapilanVeri / t1Veri) * 100; String t1TamFormula = sonUmut.format(t1TamFormul); t1TamamlananSonuc.setText("% " + ""+t1TamFormula+""); // T2 完成率计算 TextView t2TamamlananSonuc = findViewById(R.id.t2Tam); double t2TamFormul = (yapilanVeri / t2Veri) * 100; String t2TamFormula = sonUmut.format(t2TamFormul); t2TamamlananSonuc.setText("% " + ""+t2TamFormula+""); // 月度完成率计算 TextView ayTamamlananSonuc = findViewById(R.id.ayTam); double ayTamFormul = ((bugunVeri - 1) / ayGunVeri) * 100; String ayTamFormula = sonUmut.format(ayTamFormul); ayTamamlananSonuc.setText("% " + ""+ayTamFormula+""); }
崩溃原因
直接调用Double.parseDouble()解析空字符串或非数字内容时,会抛出NumberFormatException,且代码中未捕获该异常,导致应用崩溃。之前的if-else判断可能没覆盖所有输入校验场景,或者校验逻辑写在解析之后,没起到作用。
修复步骤
1. 封装安全解析Double的工具方法
避免重复编写校验逻辑,统一处理空值和格式错误:
private Double safeParseDouble(String input) { if (input == null || input.trim().isEmpty()) { return null; } try { return Double.parseDouble(input.trim()); } catch (NumberFormatException e) { e.printStackTrace(); return null; } }
2. 前置输入校验逻辑
在执行任何计算前,先获取并校验所有输入值,若存在无效值则提示用户并终止后续流程:
public void baslat (View view) { // 一次性获取所有输入控件 EditText t1 = findViewById(R.id.t1); EditText yapilan = findViewById(R.id.yapilan); EditText ayGun = findViewById(R.id.ayGun); EditText bugun = findViewById(R.id.bugun); EditText t2 = findViewById(R.id.t2); EditText adet = findViewById(R.id.adet); EditText saat = findViewById(R.id.saat); // 安全解析所有输入值 Double t1Veri = safeParseDouble(t1.getText().toString()); Double yapilanVeri = safeParseDouble(yapilan.getText().toString()); Double ayGunVeri = safeParseDouble(ayGun.getText().toString()); Double bugunVeri = safeParseDouble(bugun.getText().toString()); Double t2Veri = safeParseDouble(t2.getText().toString()); Double adetVeri = safeParseDouble(adet.getText().toString()); Double saatVeri = safeParseDouble(saat.getText().toString()); // 校验是否存在空值或无效数字 if (t1Veri == null || yapilanVeri == null || ayGunVeri == null || bugunVeri == null || t2Veri == null || adetVeri == null || saatVeri == null) { Toast.makeText(this, "请填写所有输入框,且输入有效的数字", Toast.LENGTH_SHORT).show(); return; // 直接返回,不执行计算 } // 后续原有逻辑保持不变,注意将原代码中的double变量替换为上面已校验的Double对象 TableLayout resultLayout = findViewById(R.id.resultLayout); resultLayout.setVisibility(View.VISIBLE); InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(resultLayout.getWindowToken(), 0); NumberFormat sonUmut = NumberFormat.getNumberInstance(); sonUmut.setMaximumFractionDigits(3); // T1 目标计算 TextView t1Sonuc = findViewById(R.id.t1Sonuc); double t1Formul = (t1Veri - yapilanVeri) / (ayGunVeri - bugunVeri); String t1Formula = sonUmut.format(t1Formul); t1Sonuc.setText(t1Formula); // 剩余计算逻辑复制原代码即可,无需修改(变量已替换为校验后的有效值) // ... }
3. 额外优化建议
- 给所有EditText设置
android:inputType="numberDecimal",限制用户只能输入数字和小数点,从源头减少格式错误 - 计算时增加除数非零校验,比如
ayGunVeri - bugunVeri、saatVeri等不能为0,避免抛出ArithmeticException
内容的提问来源于stack exchange,提问作者Kmor Keltas
相关产品推荐
相关产品推荐

