方法调用可能会产生NullPointerException Retrofit Body

Pri*_*iya 9 java android retrofit retrofit2

我正在使用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();
                }
Run Code Online (Sandbox Code Playgroud)

它给了我三个警告,如下所示

Method invocation getBanner_on may produce java.lang.nullPointerException
Run Code Online (Sandbox Code Playgroud)

我很困惑,无法解决此警告.让我知道是否有人可以帮我从这里出来.

谢谢

Nab*_*ari 11

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

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


Bla*_*nka 5

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

constant.banner_on = ads != null ? ads.getBanner_on() : null;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Java 8,您可以在赋值之前进行断言

Ads ads = response.body();
assert ads != null;
constant.banner_on = ads.getBanner_on();
Run Code Online (Sandbox Code Playgroud)

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

constant.banner_on = Objects.requireNonNull(ads.getBanner_on());
Run Code Online (Sandbox Code Playgroud)

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

/**
     * 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>
     * 
Run Code Online (Sandbox Code Playgroud)

关于这个问题的一个很好的答案就在这里。另请阅读本文以了解为什么我们需要显式检查。