Android应用启动崩溃求助:已定位findViewById调用时机问题
Android应用启动崩溃:解决findViewById初始化时机问题
嘿,别着急,我马上帮你搞定这个崩溃问题!你已经意识到不能在setContentView之前调用findViewById是关键,咱们就顺着这个点把代码改对,顺便补上一些避免后续崩溃的细节。
问题根源
你当前的代码里,直接在类的成员变量声明阶段就调用了findViewById:
Button btnAdd = (Button)findViewById(R.id.btnAdd); EditText num1 = (EditText)findViewById(R.id.num1); // ...其他控件初始化
这时候Activity还没执行setContentView(R.layout.activity_main),布局还没加载到Activity中,所以这些控件对象都会是null。当你在onCreate里调用btnAdd.setOnClickListener(this)时,就会触发NullPointerException,直接导致应用崩溃。
修正后的完整代码
下面是修复后的MainActivity.java,我还额外加了输入空值的判断,避免用户没输入内容时再次崩溃:
package com.example.arnab.myfirstapplication; import android.support.v7.app.AppCompatActivity; import android.app.Activity; 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 Activity implements View.OnClickListener { // 只声明控件变量,不在这里初始化 Button btnAdd; EditText num1; EditText num2; TextView result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 必须在setContentView之后,再初始化所有控件 btnAdd = (Button)findViewById(R.id.btnAdd); num1 = (EditText)findViewById(R.id.num1); num2 = (EditText)findViewById(R.id.num2); result = (TextView)findViewById(R.id.result); btnAdd.setOnClickListener(this); } @Override public void onClick(View v) { if(v == btnAdd){ // 先判断输入是否为空,避免NumberFormatException String input1 = num1.getText().toString().trim(); String input2 = num2.getText().toString().trim(); if(input1.isEmpty() || input2.isEmpty()){ Toast.makeText(this, "请输入完整的数字哦", Toast.LENGTH_SHORT).show(); return; } int n1 = Integer.parseInt(input1); int n2 = Integer.parseInt(input2); int sum = n1 + n2; result.setText(Integer.toString(sum)); } } @Override public void onPointerCaptureChanged(boolean hasCapture) { } }
关键修改点说明
- 控件初始化时机调整:把所有
findViewById的调用移到setContentView之后,这时候布局已经加载,能正确找到对应的控件ID,不会返回null。 - 增加输入校验:在转换整数之前先判断输入是否为空,避免用户没输入内容时触发
NumberFormatException,同时用Toast给用户提示,体验更友好。
后续调试小技巧
以后遇到崩溃时,可以打开Android Studio的Logcat面板,过滤Error级别日志,找到崩溃的异常类型(比如NullPointerException)和对应的代码行,这样能更快定位问题哦。
内容的提问来源于stack exchange,提问作者Arnab
相关产品推荐
相关产品推荐

