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

应用登录时调用Context.getSystemService()触发空指针异常求助

解决getSystemService()空指针异常的实用思路

兄弟,我之前也踩过一模一样的坑!从你给出的堆栈信息来看,问题核心是AppConfig.isNetworkAvailable()方法里调用getSystemService()时,Context对象是空的——哪怕你已经在Activity里调用了super.onCreate(),也不代表所有场景下的Context都是有效的。

下面是几个我亲测有效的排查和解决方向:

1. 先检查isNetworkAvailable()的Context来源

大概率是调用这个方法时传入的Context为null,或者方法内部持有的Context实例没正确初始化。给你一个安全的写法参考:

public static boolean isNetworkAvailable(Context context) {
    // 先判空,避免NPE同时给出明确错误提示
    if (context == null) {
        Log.e("AppConfig", "Context passed to isNetworkAvailable is null!");
        return false;
    }
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    // 后续网络状态检查逻辑
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null && activeNetwork.isConnected();
}

调用这个方法时,一定要传入有效的Context:比如Activity的this(确保在super.onCreate()之后使用)、Application的getApplicationContext(),或者Service的Context,绝对不能传已经销毁的组件的Context。

2. 排查调用时机是否过早

如果是在onCreate()的最开头就调用了isNetworkAvailable(),虽然super.onCreate()已经执行,但极端情况下Context可能还没完全绑定到组件上?不过这种情况很少见,更可能是你在Application初始化之前就调用了这个方法(比如静态代码块里),这时候ApplicationContext还没生成,自然会返回null。

3. 避免持有Context的静态引用

如果你的AppConfig类里用了静态变量保存Context(比如private static Context sContext;),一定要确保这个变量在Application的onCreate()里初始化:

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AppConfig.sContext = getApplicationContext();
    }
}

绝对不能用Activity的Context赋值这个静态变量——Activity销毁后,这个静态引用会导致内存泄漏,同时Context变成null,后续调用就会触发NPE。

4. 追踪完整调用链

从堆栈信息看,isNetworkAvailable()是被com.example...的某个方法调用的,你可以去这个调用点看看:是不是传了null进去?比如是不是写了AppConfig.isNetworkAvailable(null),或者传了一个还没初始化的Context变量?

先从这几个方向排查,应该能快速定位到问题!

内容的提问来源于stack exchange,提问作者Kamran Riasat Rajput

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:16:35