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) {
// 有網
}
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 請求)。