方法调用可能产生 NullPointerException Retrofit Body

新手上路,请多包涵

我正在使用 Retrofit 2 从我的 API 获取响应并将其值存储在我的常量中,如下所示

if(response.isSuccessful()) {
                    constant.banner_on = response.body().getBanner_on();
                    constant.int_on = response.body().getInt_on();
                    constant.int_click = response.body().getInt_click();
                }

它给了我以下所有三个警告

方法调用 getBanner_on 可能会产生 java.lang.nullPointerException

我很困惑,无法解决这个警告。让我知道是否有人可以帮助我摆脱困境。

原文由 Priya 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 609
2 个回答

这只是一个警告,因为如果响应成功,它永远不会为空。您可以忽略它或环绕 if(response.body() != null) 以删除警告。

 Ads ads = response.body();
if(ads != null){
    constant.banner_on = ads.getBanner_on();
    // and so on.
}

原文由 Nabin Bhandari 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 if 很好,但只有一行,更简洁的方法是:

 constant.banner_on = ads != null ? ads.getBanner_on() : null;

如果你使用的是 Java 8,你可以在赋值前做一个 断言

 Ads ads = response.body();
assert ads != null;
constant.banner_on = ads.getBanner_on();

另一种方法是在分配之前使用 Objects.requireNonNull()

 constant.banner_on = Objects.requireNonNull(ads.getBanner_on());

这实际上主要是为参数验证而设计的。源码注释:

 /**
     * Checks that the specified object reference is not {@code null}. This
     * method is designed primarily for doing parameter validation in methods
     * and constructors, as demonstrated below:
     * <blockquote><pre>
     * public Foo(Bar bar) {
     *     this.bar = Objects.requireNonNull(bar);
     * }
     * </pre></blockquote>
     *

一个很好的 SO 答案就在这里。另 请阅读本文以了解为什么我们需要明确检查。 .

原文由 Blasanka 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题