【问题标题】:NullPointerException when asking if internet is available [duplicate]询问互联网是否可用时出现 NullPointerException [重复]
【发布时间】:2020-01-24 00:49:03
【问题描述】:

在我的应用程序开始时(在 MainActivity onCreate 中)我用以下代码询问是否有互联网连接:

boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
        connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
    //we are connected to a network
    connected = true;
} else
    connected = false;

但我在 Google 开发控制台中收到以下来自混合 android 版本的崩溃报告:

java.lang.RuntimeException: 

  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2944)

  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3079)

  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78)

  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108)

  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68)

  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1836)

  at android.os.Handler.dispatchMessage (Handler.java:106)

  at android.os.Looper.loop (Looper.java:193)

  at android.app.ActivityThread.main (ActivityThread.java:6702)

  at java.lang.reflect.Method.invoke (Native Method)

  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)

  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:911)
Caused by: java.lang.NullPointerException: 

  at com.fujigames.memesoundboard.MainActivity.onCreate (MainActivity.java:99)

  at android.app.Activity.performCreate (Activity.java:7136)

  at android.app.Activity.performCreate (Activity.java:7127)

  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1271)

  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2924)

MainActivity.java:99 是我上面显示的代码。 为什么我会发生这种崩溃,我应该怎么做才能修复它? 谢谢。

【问题讨论】:

    标签: java android nullpointerexception permissions


    【解决方案1】:

    为什么会出现这个崩溃?

    1. getSystemService 调用可以返回 null。你需要检查并处理它。

    2. getNetworkInfo 调用可以返回 null。你需要检查并处理它。

    您没有检查null 返回,所以它看起来其中之一是您的 NPE 的根本原因。


    我应该怎么做才能解决它?

    要解决这些问题,首先阅读相应方法的 javadocs 以了解何时/为什么可以返回 null。然后修改您的代码以执行适当的操作。

    (弄清楚如果根本没有网络服务,或者 Wifi 和/或移动设备不可用,您的应用应该怎么做?我们无法告诉您。)


    请注意,javadocs 说 getNetworkInfo(...) 在 API 级别 29 中已弃用。因此,将来可能需要完全替换此代码。

    【讨论】:

    • 好的,但为什么它可以在 97% 的用户设备上运行,我只有 3% 的用户收到此 NullPointerException。
    • 我无法回答。除了显而易见的...... 3% 用户的设备上/关于某些东西是不同的。如果您将代码编写得更健壮,那就没有实际意义了;即在 javadocs 声明可能返回 null 的情况下测试 null!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多