You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完全就绪后再创建实例,具体操作如下:

  1. 修改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();
        // ... 后续初始化代码 ...
    }
}
  1. 调整方法调用顺序:
    原来的代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:23:15