Android Studio应用运行自动崩溃的解决方法
解决Android应用启动崩溃问题:NullPointerException
问题根源
从崩溃日志的关键栈信息可定位核心问题:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference ... at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:264) at com.example.testing.MainActivity.<init>(MainActivity.java:13)
问题出在类成员变量初始化阶段调用了findViewById:
TextView answer = (TextView) findViewById(R.id.answer);
Activity实例化时(<init>阶段),Context还未完成初始化,此时调用findViewById会直接触发空指针异常。findViewById必须在setContentView之后、Activity生命周期方法(如onCreate)内调用,因为此时布局已加载,Context也处于就绪状态。
修复代码
修改MainActivity.java,将控件初始化逻辑移到onCreate方法内,且放在setContentView之后:
package com.example.testing; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button residental; private Button highway; private TextView answer; // 仅声明变量,不提前初始化 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 所有控件初始化必须在setContentView之后执行 highway = findViewById(R.id.highway); residental = findViewById(R.id.residental); answer = findViewById(R.id.answer); // 移至此处完成初始化 int residentalAmount = 45; int highwayAmount = 75; highway.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { answer.setText("You should go"); answer.setVisibility(View.VISIBLE); // 修复原注释中的错误写法 } }); } }
额外说明
- 控件初始化的正确时机:必须在
setContentView(R.layout.xxx)之后,确保布局已加载到Activity中,才能通过ID找到对应的控件。 - 原代码中
answer.setVisibility = true;是错误语法,正确调用方式为answer.setVisibility(View.VISIBLE),View.VISIBLE是Android内置常量,用于设置控件可见状态。
内容的提问来源于stack exchange,提问作者wrist
相关产品推荐
相关产品推荐

