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

Android简易计算器运行崩溃求助(附Java与XML代码)

Android简易计算器运行崩溃问题解决

崩溃核心原因

你直接在成员变量声明阶段调用findViewById(),此时Activity还未执行setContentView()加载布局,所有控件实例均为null,触发**空指针异常(NullPointerException)**导致程序直接崩溃。

修正后的核心代码

将控件初始化逻辑移到onCreate()方法的setContentView()之后,确保布局加载完成后再获取有效控件实例:

package com.example.calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    // 仅声明成员变量,不提前初始化
    private EditText etNum1;
    private EditText etNum2;
    private Button btnAdd;
    private Button btnSub;
    private Button btnMul;
    private Button btnDiv;
    private TextView tvAns;

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

        // 布局加载完成后,初始化所有控件
        etNum1 = findViewById(R.id.etNum1);
        etNum2 = findViewById(R.id.etNum2);
        btnAdd = findViewById(R.id.btAdd);
        btnSub = findViewById(R.id.btSub);
        btnMul = findViewById(R.id.btMul);
        btnDiv = findViewById(R.id.btDiv);
        tvAns = findViewById(R.id.tvAns);

        btnAdd.setOnClickListener(v -> calculate('+'));
        btnSub.setOnClickListener(v -> calculate('-'));
        btnMul.setOnClickListener(v -> calculate('*'));
        btnDiv.setOnClickListener(v -> calculate('/'));
    }

    // 提取统一计算逻辑,避免代码重复
    private void calculate(char operator) {
        String num1Str = etNum1.getText().toString().trim();
        String num2Str = etNum2.getText().toString().trim();

        // 处理空输入
        if (num1Str.isEmpty() || num2Str.isEmpty()) {
            Toast.makeText(this, "请输入完整数字", Toast.LENGTH_SHORT).show();
            return;
        }

        try {
            int n1 = Integer.parseInt(num1Str);
            int n2 = Integer.parseInt(num2Str);
            int ans = 0;

            switch (operator) {
                case '+': ans = n1 + n2; break;
                case '-': ans = n1 - n2; break;
                case '*': ans = n1 * n2; break;
                case '/':
                    // 处理除零异常
                    if (n2 == 0) {
                        Toast.makeText(this, "除数不能为0", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    ans = n1 / n2;
                    break;
            }
            tvAns.setText(String.valueOf(ans));
        } catch (NumberFormatException e) {
            Toast.makeText(this, "请输入有效整数", Toast.LENGTH_SHORT).show();
        }
    }
}

额外优化建议

  1. 限制输入类型:在activity_main.xml中,将两个EditText的android:inputType从textPersonName改为number,强制仅能输入数字,减少异常触发:
android:inputType="number"
  1. 简化点击监听:使用Lambda表达式替代匿名内部类,让代码更简洁。
  2. 异常兜底:增加空输入、非数字输入、除零场景的提示,提升用户体验。

内容的提问来源于stack exchange,提问作者Akash Nai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:10:43