Android Studio Unable to start activity ComponentInfo报错排查
运行报错信息
运行时: FATAL EXCEPTION: main
Process: com.example.puzzle_project, PID: 4100
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.puzzle_project/com.example.puzzle_project.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
报错原因
findViewById(R.id.button) 返回了null对象,后续对这个null对象调用setOnClickListener方法直接触发空指针崩溃。本质是代码在当前加载的布局里没找到对应id的Button控件。
排查方向
- 核对
res/layout/activity_main.xml布局文件:确认布局中存在Button控件,且控件id严格为@+id/button,无拼写错误、大小写错误(比如写成@+id/btn、@+id/Button都会匹配失败) - 核对
setContentView加载的布局:确认onCreate中加载的确实是包含目标按钮的布局,没有写错布局资源名(比如把R.layout.activity_main写成其他布局id) - 核对R类导入:确认文件顶部导入的是当前项目的R类
com.example.puzzle_project.R,没有误导入系统自带的android.R - 顺带排查同逻辑下的其他控件:
openActivity2方法中通过id查找的edittext1、edittext2存在完全相同的空指针风险,排查按钮问题时同步核对这两个控件id
修复方法
- 在activity_main.xml中补充/修正对应控件的id,示例布局片段:
<!-- 跳转按钮 --> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="进入第二页"/> <!-- 文本输入框 --> <EditText android:id="@+id/edittext1" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入文本内容"/> <!-- 数字输入框 --> <EditText android:id="@+id/edittext2" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:hint="输入数字"/>
- 修正代码中的空指针隐患,增加必要的校验逻辑,避免输入为空、格式错误导致的二次崩溃,修正后的MainActivity核心代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); // 增加空判断避免控件不存在时崩溃 if (button != null) { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { openActivity2(); } }); } } public void openActivity2(){ EditText editText1= findViewById(R.id.edittext1); String text = ""; // 校验控件和输入内容非空 if (editText1 != null && editText1.getText() != null) { text = editText1.getText().toString().trim(); } EditText editText2=findViewById(R.id.edittext2); int number = 0; if (editText2 != null && editText2.getText() != null) { String numContent = editText2.getText().toString().trim(); if (!numContent.isEmpty()) { try { number = Integer.parseInt(numContent); } catch (NumberFormatException e) { // 输入非数字时默认给0,避免格式转换崩溃 number = 0; } } } Intent intent = new Intent(this, Activity2.class); intent.putExtra(EXTRA_TEXT,text); intent.putExtra(EXTRA_NUMBER,number); startActivity(intent); }
- 代码修改完成后,依次点击菜单栏
Build->Clean Project,等待清理完成后再点击Build->Rebuild Project,清除旧的编译缓存后重新运行应用即可。
内容的提问来源于stack exchange,提问作者MOLO
相关产品推荐
相关产品推荐

