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

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常量但未定义,会直接编译失败。

修复方案
  1. 修改单例获取逻辑,传入Application级Context初始化,避免内存泄漏
  2. 在构造方法中提前初始化系统服务,减少重复调用开销
  3. 调整方法调用顺序,先执行WiFi状态检测再获取结果
  4. 补全缺失的常量、权限声明

修复后的单例类代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:03:49