Android Studio使用单例类检测Wi-Fi连接报空对象引用错误
问题描述
在Android Studio中使用单例类实现Wi-Fi连接检测功能,点击按钮触发对应逻辑时抛出如下空指针错误:Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
关联代码
原有单例类实现
public class WifiConnectivity { private static WifiConnectivity INSTANCE = null ; private ConnectivityManager cnmgr; Context context; int ipadress; String ipAddress; public static WifiConnectivity getInstance() { if (INSTANCE == null){ INSTANCE = new WifiConnectivity(); } return INSTANCE; } public ConnectivityManager getWifiConnectivty(int ipadress , String ipAddress){ this.ipadress = ipadress; this.ipAddress = ipAddress; return cnmgr; } public void Connectivity() { cnmgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cnmgr.getActiveNetworkInfo() != null && cnmgr.getActiveNetworkInfo().isAvailable() && cnmgr.getActiveNetworkInfo().isConnected()) { WifiManager wifiMgr = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); ipadress = wifiInfo.getIpAddress(); ipAddress = Formatter.formatIpAddress(ipadress); Log.d(TAG, "wifi_connectivity:"); }else { Toast.makeText(context , "Wifi Not Connect" , Toast.LENGTH_SHORT).show(); } } private WifiConnectivity(){} }
原有按钮点击调用逻辑
WifiConnectivity.getInstance().getWifiConnectivty(ipadress, ipAddress); WifiConnectivity.getInstance().Connectivity();
报错原因
- 核心触发点:单例类中的
context成员变量从未被赋值,始终为null。执行context.getSystemService()时相当于在空对象上调用方法,直接抛出空指针异常。 - 单例设计缺陷:
getInstance()方法没有接收Context入参,私有构造方法也没有初始化Context属性,整个类中无任何给context赋值的逻辑。 - 逻辑顺序错误:先调用
getWifiConnectivty()方法时,cnmgr还未初始化,返回值永远为null,方法执行顺序颠倒。 - 潜在隐患:如果直接传入Activity/Fragment的Context,单例生命周期长于页面时会造成内存泄漏。
- 代码缺失:类中使用了
TAG常量但未定义,会直接编译失败。
修复方案
- 修改单例获取逻辑,传入Application级Context初始化,避免内存泄漏
- 在构造方法中提前初始化系统服务,减少重复调用开销
- 调整方法调用顺序,先执行WiFi状态检测再获取结果
- 补全缺失的常量、权限声明
修复后的单例类代码
public class WifiConnectivity { private static final String TAG = "WifiConnectivity"; private static WifiConnectivity INSTANCE = null; private final ConnectivityManager cnmgr; private final WifiManager wifiMgr; private final Context appContext; private int ipadress; private String ipAddress; public static WifiConnectivity getInstance(Context context) { if (INSTANCE == null){ INSTANCE = new WifiConnectivity(context.getApplicationContext()); } return INSTANCE; } private WifiConnectivity(Context context){ appContext = context; cnmgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } public String checkWifiConnectivity(){ NetworkInfo activeNet = cnmgr.getActiveNetworkInfo(); if (activeNet != null && activeNet.isAvailable() && activeNet.isConnected()) { WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); ipadress = wifiInfo.getIpAddress(); ipAddress = Formatter.formatIpAddress(ipadress); Log.d(TAG, "wifi connected, ip: " + ipAddress); return ipAddress; }else { Toast.makeText(appContext , "Wifi Not Connect" , Toast.LENGTH_SHORT).show(); return null; } } public int getIpadress() { return ipadress; } public String getIpAddress() { return ipAddress; } }
修复后的调用方式
在按钮点击事件中按如下逻辑调用:
WifiConnectivity wifiHelper = WifiConnectivity.getInstance(getApplicationContext()); String currentIp = wifiHelper.checkWifiConnectivity(); if (currentIp != null) { int currentIpInt = wifiHelper.getIpadress(); // 后续IP相关业务逻辑 }
必要配置
在AndroidManifest.xml中声明所需权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
注:Android 10及以上版本
getActiveNetworkInfo()已被标记废弃,可按需使用NetworkCallbackAPI做高版本适配。
内容的提问来源于stack exchange,提问作者Farzan Siddiqui
相关产品推荐
相关产品推荐

