应用登录时调用Context.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

