错误日志收集中发现一个空指针
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } in com.carlt.networklibs.NetworkStateReceiver@6b75cbe at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52651(LoadedApk.java:1329) at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7(Unknown Source:4) at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run(Unknown Source:39) at android.os.Handler.handleCallback(Handler.java:794) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:6651) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference at com.carlt.networklibs.utils.NetworkUtils.getNetType(NetworkUtils.java:57) at com.carlt.networklibs.NetworkStateReceiver.onReceive(NetworkStateReceiver.java:46) at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52651(LoadedApk.java:1319) ... 9 more java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference at com.carlt.networklibs.utils.NetworkUtils.getNetType(NetworkUtils.java:57) at com.carlt.networklibs.NetworkStateReceiver.onReceive(NetworkStateReceiver.java:46) at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52651(LoadedApk.java:1319) at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7(Unknown Source:4) at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run(Unknown Source:39) at android.os.Handler.handleCallback(Handler.java:794) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:6651) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
if (type == ConnectivityManager.TYPE_MOBILE) { if (activeNetworkInfo.getExtraInfo().toLowerCase().equals("cmnet")) { return NetType.CMNET; } else { return NetType.CMWAP; } 应该是源码的这段代码,activeNetworkInfo.getExtraInfo()这个要判空一下。有些手机似乎会报空指针。目前发现的手机大部分来自小米。
是的需要判空一下的,或者equlals写左面就没事了
好的,下来我找个小米手机测试一下,然后修复一下
@allenlzhang 这个我也遇到了 设备机型
华为 LYA AL10 系统版本
Android 9,level 28
ROM
HuaWei/EMOTION
CPU架构
arm64-v8a
/** * 获取网络类型 * * @return */
public static NetType getNetType() {
ConnectivityManager connmagr = (ConnectivityManager) NetworkManager.getInstance().getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connmagr == null) {
return NetType.NONE;
}
NetworkInfo activeNetworkInfo = connmagr.getActiveNetworkInfo();
if (activeNetworkInfo != null) {
int type = activeNetworkInfo.getType();
if (type == ConnectivityManager.TYPE_MOBILE) {
if ("cmnet".equals(activeNetworkInfo.getExtraInfo().toLowerCase())) {
return NetType.CMNET;
} else {
return NetType.CMWAP;
}
} else if (type == ConnectivityManager.TYPE_WIFI) {
return NetType.WIFI;
}
}
return NetType.NONE;
}
java.lang.NullPointerException:Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference
建议改成 判空形式
public static NetType getNetType() {
ConnectivityManager connmagr = (ConnectivityManager) NetworkManager.getInstance().getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connmagr == null) {
return NetType.NONE;
}
NetworkInfo activeNetworkInfo = connmagr.getActiveNetworkInfo();
if (activeNetworkInfo != null) {
int type = activeNetworkInfo.getType();
if (type == ConnectivityManager.TYPE_MOBILE) {
String extraInfo = activeNetworkInfo.getExtraInfo();
if (extraInfo != null && !extraInfo.isEmpty()) {
if (extraInfo.equalsIgnoreCase("cmnet")) {
return NetType.CMNET;
} else {
return NetType.CMWAP;
}
}
} else if (type == ConnectivityManager.TYPE_WIFI) {
return NetType.WIFI;
}
}
return NetType.NONE;
}
亲测线上不再复现。。。建议及时更新代码 @allenlzhang
bug已经修复了,谢谢各位。