Android中调用Context.getApplicationInfo()空指针异常求助
解决Context.getApplicationInfo()空指针异常问题
问题根源
从报错栈能清晰定位到异常触发点:SQLiteAssetHelper的构造函数调用Context.getApplicationInfo()时遇到了空对象引用。追根溯源,问题出在你在MainActivity的成员变量声明阶段直接初始化了Database:
Database database = new Database(this);
在Android的生命周期中,Activity的成员变量初始化会在onCreate()方法执行前完成,这时候Activity的Context还没完全初始化就绪,传递给Database的this(Context对象)处于未激活状态,最终导致SQLiteAssetHelper无法正常调用Context相关方法,抛出空指针异常。
解决方案
核心思路是调整Database的初始化时机,等到Activity的Context完全就绪后再创建实例,具体操作如下:
- 修改Database的声明方式,只声明变量,不直接初始化:
public class MainActivity extends AppCompatActivity { // ... 其他成员变量保留不变 ... // 仅声明Database变量,暂不初始化 private Database database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ... 先完成视图控件的初始化 ... // 在这里初始化Database,此时Activity的Context已经完全就绪 database = new Database(this); // 再调用依赖Database的方法 LoadSuggestList(); // ... 后续初始化代码 ... } }
- 调整方法调用顺序:
原来的代码中LoadSuggestList()在onCreate()里是在Database初始化前调用的,现在必须把它移到database = new Database(this);之后,确保调用database.getName()时,Database已经被正确初始化。
修改后的完整MainActivity关键代码片段
public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; RecyclerView.LayoutManager layoutManager; SearchAdapter adapter; private Context context; MaterialSearchBar materialSearchBar; List<String> suggestList = new ArrayList<>(); // 仅声明Database变量 private Database database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView)findViewById(R.id.recycler_search); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); materialSearchBar =(MaterialSearchBar)findViewById(R.id.search_bar); materialSearchBar.setHint("Search"); materialSearchBar.setCardViewElevation(10); // 等到Context就绪后初始化Database database = new Database(this); // 现在可以安全调用依赖Database的方法 LoadSuggestList(); // ... 剩余的TextChangeListener、OnSearchActionListener等代码保持不变 ... adapter = new SearchAdapter(this,database.getPharmacy()); recyclerView.setAdapter(adapter); } // ... 其他方法保持不变 ... }
补充说明
之前你用new Database(this)解决了getName()的空指针,是因为当时是在onCreate()方法内初始化的Database,Context已经就绪。但这次你把初始化放在了成员变量位置,跳过了Context就绪的关键时机,才触发了新的异常。记住:所有依赖Activity Context的对象,都不要在成员变量声明阶段初始化,务必等到onCreate()方法内(super.onCreate(savedInstanceState)执行之后)再创建实例。
内容的提问来源于stack exchange,提问作者Hasini
相关产品推荐
相关产品推荐

