Android应用启动崩溃:java.lang.NullPointerException问题求助
嘿,这个问题我之前也碰到过!这个java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference错误,根源很明确——你在Activity还没完成基础初始化(尤其是Window对象还没创建)的时候,就尝试去操作View相关的内容了。
结合你给出的代码片段,我给你整理了几个必查的修复点:
必须优先调用
super.onCreate(savedInstanceState)
在你的onCreate方法最开头,一定要先调用父类的super.onCreate(savedInstanceState),它会完成Activity核心的初始化流程,包括创建Window实例。如果跳过这一步,后续所有依赖Window的操作都会直接崩溃。setContentView必须在初始化View之前
你要先通过setContentView(R.layout.your_main_layout)加载Activity对应的布局文件,这一步会把布局和Window绑定,之后才能通过findViewById获取到EditText等View组件。如果在加载布局之前就初始化View,不仅找不到控件,还会间接导致Window相关的空指针。检查布局文件的正确性
确认你在setContentView里引用的布局文件存在于res/layout目录下,并且没有拼写错误。如果布局引用错误,setContentView会静默失败,同样会引发后续的Window空指针问题。
修复后的示例代码
package com.example.andriod.hostelapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // 第一步:调用父类初始化方法,必须放在最前面 super.onCreate(savedInstanceState); // 第二步:加载布局,绑定Window和界面 setContentView(R.layout.activity_main); // 第三步:现在可以安全地初始化View了 EditText usernameEditText = findViewById(R.id.username); // 后续业务逻辑 Toast.makeText(this, "应用启动成功!", Toast.LENGTH_SHORT).show(); } }
如果按照上面的步骤修复后还是崩溃,可以再检查一下:有没有在onCreate之外的生命周期方法(比如onStart)里过早操作View?或者有没有使用特殊的自定义Theme导致Window初始化异常?不过绝大多数情况下,前面的三个修复点就能解决问题啦。
内容的提问来源于stack exchange,提问作者ritwik sharma

