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

Android空EditText点击Button崩溃问题求助

Android 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:55:18