修复Android计算器应用崩溃:避免空值和无效字符

本文旨在帮助开发者解决Android计算器应用因尝试解析空字符串或包含无效字符的字符串而导致的崩溃问题。通过在解析前进行字符串的预处理,包括判空和去除空格,可以有效避免 NumberFormatException 异常,从而提升应用的稳定性和用户体验。文章提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这些技巧。

在开发Android计算器应用时,经常会遇到从 TextView 中获取用户输入并进行数值计算的情况。如果 TextView 中的内容为空,或者包含非

数字字符(例如空格),直接使用 Double.parseDouble() 方法进行解析会导致 NumberFormatException 异常,进而导致应用崩溃。以下介绍如何避免这种情况。

字符串预处理

在尝试将 TextView 的文本转换为 double 类型之前,务必进行以下预处理:

  1. 判空检查: 确保 TextView 中的文本不为空。
  2. 去除空格: 使用 trim() 方法移除字符串首尾的空格。

以下是修改后的 buttonFunctionNumber 方法示例:

public void buttonFunctionNumber(View view) {
    if (view instanceof Button){
        Button button = (Button) view;
        String str = button.getText().toString();
        String resultText = result.getText().toString().trim(); // 获取文本并去除空格

        if (resultText != null && !resultText.isEmpty()) { // 判空检查
            if (Double.parseDouble(resultText) == 0.0)
                result.setText(str);
            else
                result.append(str);
        } else {
            result.setText(str); // 如果为空,则直接设置
        }
    }
}

代码解释:

  • String resultText = result.getText().toString().trim();:首先获取 result TextView 的文本内容,并使用 trim() 方法移除首尾空格。
  • if (resultText != null && !resultText.isEmpty()):检查 resultText 是否为 null 并且不为空字符串。如果满足条件,则继续进行数值解析。
  • else { result.setText(str); }:如果 resultText 为空,则直接将当前按下的数字按钮的文本设置到 result TextView 中。

示例:其他函数中的应用

上述方法同样适用于其他需要解析 TextView 文本的函数,例如 buttonEqualFunction、buttonAddFunction 等。 以下是 buttonEqualFunction 的修改示例:

public void buttonEqualFunction(View view) {
    if (view instanceof Button) {
        String temp2 = result.getText().toString().trim(); // 获取文本并去除空格

        if (temp2 != null && !temp2.isEmpty()) { // 判空检查
            num2 = Double.parseDouble(temp2);
            double res = 0.0;

            switch (sign) {
                case "+":
                    res = num1 + num2;
                    break;
                case "-":
                    res = num1 - num2;
                    break;
                case "*":
                    res = num1 * num2;
                    break;
                case "/":
                    if (num2 != 0.0)
                        res = num1 / num2;
                    else
                        Toast.makeText(this, "Error Cant divide by 0", Toast.LENGTH_LONG).show();
                    break;
                default:
                    break;
            }

            num1 = res;
            result.setText(String.valueOf(res)); // 使用 String.valueOf() 避免隐式类型转换问题
        } else {
            // 处理 temp2 为空的情况,例如显示错误信息
            Toast.makeText(this, "Invalid input", Toast.LENGTH_SHORT).show();
        }
    }
}

注意事项:

  • 始终在使用 Double.parseDouble() 之前进行判空和去除空格操作。
  • 考虑用户输入非数字字符的情况,可以使用正则表达式进行更严格的输入验证。
  • 使用 String.valueOf() 代替 res + "" 进行 double 到 String 的转换,避免潜在的类型转换问题。
  • 添加适当的错误处理逻辑,例如在输入为空或无效时显示错误信息,提升用户体验。

总结

通过对 TextView 中的文本进行预处理,可以有效地避免因解析空字符串或包含无效字符的字符串而导致的 NumberFormatException 异常,从而提高Android计算器应用的稳定性和用户体验。 务必在代码中养成良好的习惯,对用户输入进行验证和处理,确保应用的健壮性。