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

Android应用启动崩溃求助:NullPointerException问题排查

问题分析与解决方案

先看你的崩溃日志,核心错误点很明确:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

这个问题出在你直接在Activity类的成员变量声明阶段就调用了findViewById()。此时Activity还没走完初始化流程,onCreate()方法都没执行,布局文件也没通过setContentView()加载进来,更关键的是Activity的Window对象还没创建,这时候调用依赖Window的findViewById()(尤其是AppCompatActivity的实现)就会触发空指针异常。

另外还有个隐藏坑:你在display1()和display2()里直接用setText(a),这里的a是int类型,Android会把它当成资源ID去查找字符串,而不是显示数字本身,运行后会报资源找不到的错误,这个也得一起修正。

修正步骤

  • 先声明控件变量,不要直接初始化:把所有Button和TextView的声明改成只定义变量,不调用findViewById()。
  • 在onCreate()中加载布局后再初始化控件:必须在setContentView(R.layout.activity_main)之后,再调用findViewById()获取控件实例。
  • 修正setText()的调用方式:把int类型的数值转成字符串再传入setText()。

修改后的完整代码

package com.example.otel.stupidbuttons;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    // 只声明控件变量,暂不初始化
    Button b1g1;
    Button b2g1;
    Button b3g1;
    Button b1g2;
    Button b2g2;
    Button b3g2;
    TextView leftText;
    TextView rightText;

    int leftValue = 0;
    int rightValue = 0;

    public void display1(int a) {
        // 将int转为字符串,避免被当成资源ID
        leftText.setText(String.valueOf(a));
    }

    public void display2(int a) {
        rightText.setText(String.valueOf(a));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 加载布局后,再初始化所有控件
        b1g1 = findViewById(R.id.b1g1);
        b2g1 = findViewById(R.id.b2g1);
        b3g1 = findViewById(R.id.b3g1);
        b1g2 = findViewById(R.id.b1g2);
        b2g2 = findViewById(R.id.b2g2);
        b3g2 = findViewById(R.id.b3g2);
        leftText = findViewById(R.id.leftText);
        rightText = findViewById(R.id.rightText);

        // 设置按钮点击事件
        b1g1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                leftValue += 3;
                display1(leftValue);
            }
        });

        b2g1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                leftValue += 2;
                display1(leftValue);
            }
        });

        b3g1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                leftValue += 1;
                display1(leftValue);
            }
        });

        b1g2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                rightValue += 3;
                display2(rightValue);
            }
        });

        b2g2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                rightValue += 2;
                display2(rightValue);
            }
        });

        b3g2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                rightValue += 1;
                display2(rightValue);
            }
        });
    }
}

额外小优化

我把你原来的数值更新逻辑简化了,比如int a = leftValue; a = a+3; leftValue = a;直接改成leftValue +=3;,代码更简洁易读。

这样修改后,你的应用应该就能正常运行,点击按钮时对应的TextView会正确显示递增的数值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:19:02