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
相关产品推荐
相关产品推荐

