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

Android Studio小数输入崩溃求助:周饮水量计算应用优化

嘿,我来帮你解决这个问题!你的应用崩溃主要有两个核心原因,咱们一步步来修复:

问题根源拆解
  1. 整数解析不支持小数:你用了Integer.parseInt()来转换输入,但用户输入的是带逗号的小数(比如2,3),Integer只能处理整数,这种情况会直接抛出NumberFormatException导致崩溃。
  2. 验证逻辑无效:你当前的验证只检查了周一的输入框,而且判断逻辑不对——allDays.equals("")这种写法根本没起到验证所有输入的作用,其他6天的输入完全没被检查。
解决方案

咱们从三个方面修复代码:

1. 改用浮点类型支持小数

把存储饮水量的变量从int改成double,用Double.parseDouble()来解析输入,这样就能处理整数和小数了。另外如果用户输入的是逗号作为小数点(欧洲地区习惯),可以先把逗号替换成点,兼容不同输入习惯。

2. 批量处理所有输入框

把7个EditText放到一个列表里,循环遍历每个输入框做验证和解析,避免重复写7次相同代码,还能确保每个输入都被检查。

3. 添加异常捕获

解析数字时捕获NumberFormatException,处理用户输入非数字的情况(比如输入字母、空内容)。

修改后的完整代码
public class MainActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

        Button calculateBtn = findViewById(R.id.calculateBtn);
        calculateBtn.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View view) { 
                // 把所有输入框放到列表里,批量处理
                List<EditText> drinkInputs = Arrays.asList(
                        findViewById(R.id.editTextMon),
                        findViewById(R.id.editTextTue),
                        findViewById(R.id.editTextWed),
                        findViewById(R.id.editTextThu),
                        findViewById(R.id.editTextFri),
                        findViewById(R.id.editTextSat),
                        findViewById(R.id.editTextSun)
                );

                TextView resultTextView = findViewById(R.id.resultTextView);
                TextView errorView = findViewById(R.id.errorView);
                TextView averageTextView = findViewById(R.id.averageTextView);

                // 重置结果和错误提示
                resultTextView.setText("");
                averageTextView.setText("");
                errorView.setText("");

                double total = 0.0;
                boolean isValidInput = true;

                // 循环遍历每个输入框,验证并计算总和
                for (EditText input : drinkInputs) {
                    String inputText = input.getText().toString().trim();
                    
                    // 检查输入是否为空
                    if (inputText.isEmpty()) {
                        errorView.setText("请填写所有日期的饮水量");
                        isValidInput = false;
                        break;
                    }

                    // 处理逗号作为小数点的情况,替换成点
                    String normalizedText = inputText.replace(",", ".");
                    try {
                        double drinkAmount = Double.parseDouble(normalizedText);
                        // 额外添加饮水量不能为负数的验证
                        if (drinkAmount < 0) {
                            errorView.setText("饮水量不能为负数");
                            isValidInput = false;
                            break;
                        }
                        total += drinkAmount;
                    } catch (NumberFormatException e) {
                        errorView.setText("请输入有效的数字(支持整数和小数)");
                        isValidInput = false;
                        break;
                    }
                }

                // 如果输入有效,计算并显示结果
                if (isValidInput) {
                    double average = total / 7;
                    resultTextView.setText(String.format("Total: %.2f L", total));
                    averageTextView.setText(String.format("Avg: %.2f L", average));
                }
            } 
        }); 
    } 
}
额外优化建议
  • 给每个EditText设置输入类型:在XML里添加android:inputType="numberDecimal",这样用户只能输入数字、小数点/逗号,减少无效输入。
  • 可以给输入框添加android:hint="比如:2.5",引导用户正确输入格式。
  • 如果需要更严格的验证,可以用正则表达式检查输入格式是否符合数字规范。

内容的提问来源于stack exchange,提问作者Bas van der Veen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:17:22