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

Android Java简易计算器问题:等于按钮始终禁用且空值易崩溃

解决Android计算器等于按钮始终禁用与空输入崩溃问题

你的代码存在两个核心问题:

  • 等于按钮初始设为false后,没有正确的启用逻辑(原本的TextWatcher被注释,且仅计划监听单个输入框)
  • 点击等于按钮时未检查输入框内容,直接调用Integer.parseInt会导致空输入/非数字输入时崩溃,且空判断逻辑完全错误(误判按钮文本而非输入框内容)

修复后的完整代码

package com.codecademy.simplecalculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    EditText firstNumber;
    EditText secondNumber;
    RadioGroup operators;
    RadioButton add;
    RadioButton subtract;
    RadioButton divide;
    RadioButton multiply;
    Button equals;
    TextView result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firstNumber = findViewById(R.id.number1);
        secondNumber = findViewById(R.id.number2);
        operators = findViewById(R.id.Radio_Groupoperators);
        add = findViewById(R.id.add);
        subtract = findViewById(R.id.subtract);
        multiply = findViewById(R.id.multiply);
        divide = findViewById(R.id.divide);
        equals = findViewById(R.id.equals);
        result = findViewById(R.id.result);

        equals.setEnabled(false);

        // 共用输入监听,双输入框都不为空时才启用等于按钮
        TextWatcher inputWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}

            @Override
            public void afterTextChanged(Editable s) {
                String firstInput = firstNumber.getText().toString().trim();
                String secondInput = secondNumber.getText().toString().trim();
                equals.setEnabled(!firstInput.isEmpty() && !secondInput.isEmpty());
            }
        };

        firstNumber.addTextChangedListener(inputWatcher);
        secondNumber.addTextChangedListener(inputWatcher);

        equals.setOnClickListener(v -> {
            String firstStr = firstNumber.getText().toString().trim();
            String secondStr = secondNumber.getText().toString().trim();

            // 双重校验输入完整性
            if (firstStr.isEmpty() || secondStr.isEmpty()) {
                Toast.makeText(this, "请输入完整数字", Toast.LENGTH_SHORT).show();
                return;
            }

            int firstNum, secondNum;
            try {
                // 捕获非数字输入异常
                firstNum = Integer.parseInt(firstStr);
                secondNum = Integer.parseInt(secondStr);
            } catch (NumberFormatException e) {
                Toast.makeText(this, "请输入有效数字", Toast.LENGTH_SHORT).show();
                return;
            }

            int selectedOpId = operators.getCheckedRadioButtonId();
            Integer answer = null;

            if (selectedOpId == add.getId()) {
                answer = firstNum + secondNum;
            } else if (selectedOpId == subtract.getId()) {
                answer = firstNum - secondNum;
            } else if (selectedOpId == multiply.getId()) {
                answer = firstNum * secondNum;
            } else if (selectedOpId == divide.getId()) {
                // 处理除零错误
                if (secondNum == 0) {
                    Toast.makeText(this, "除数不能为0", Toast.LENGTH_SHORT).show();
                    return;
                }
                answer = firstNum / secondNum;
            } else {
                Toast.makeText(this, "请选择运算符", Toast.LENGTH_SHORT).show();
                return;
            }

            if (answer != null) {
                result.setText(answer.toString());
            }
        });
    }
}

关键修改说明

  • 完善输入监听:创建共用的TextWatcher绑定到两个输入框,只有双输入框都非空时才启用等于按钮
  • 修复输入校验:点击按钮时先检查输入完整性,为空则直接提示并终止执行
  • 添加异常处理:捕获NumberFormatException,处理用户输入非数字的场景
  • 新增除零判断:除法运算前校验除数,避免因除零导致崩溃
  • 移除无效逻辑:删除原代码中判断等于按钮文本的错误逻辑

内容的提问来源于stack exchange,提问作者angélique copérée

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:10:29