首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 判斷網絡狀態空指針異常:getActiveNetworkInfo() 返回 null 根因與修正

     編輯:程式設計綜合問答

錯誤代碼

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
if (cm.getActiveNetworkInfo().isAvailable()) { // 此處拋 NPE
    // 有網
}

根因分析

ConnectivityManager.getActiveNetworkInfo() 在設備未連接任何網絡時返回 null。直接調用 .isAvailable() 導致空指針異常。

修正寫法

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo activeInfo = cm.getActiveNetworkInfo();
boolean isConnected = activeInfo != null && activeInfo.isConnected(); // 先判 null 再調用
if (isConnected) {
    // 有網
}

進階:API 29+ (Android 10) 建議用法

getActiveNetworkInfo() 在 API 29 標記棄用,推薦使用 NetworkCapabilities:

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
    boolean hasNet = caps != null 
        && (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
         || caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
         || caps.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
} else {
    NetworkInfo info = cm.getActiveNetworkInfo();
    boolean hasNet = info != null && info.isConnected();
}

權限聲明

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

最佳實踐封裝工具類

public class NetworkUtils {
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm == null) return false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
            return caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
        } else {
            NetworkInfo info = cm.getActiveNetworkInfo();
            return info != null && info.isConnected();
        }
    }
}

總結

核心原則:任何可能返回 null 的對象方法調用前,必須先判空。網絡狀態檢查更應考慮多 API 版本兼容與實際連通性驗證 (如 ping 或 HTTP 請求)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved