我正在使用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();
}
它给了我三个警告,如下所示
Method invocation getBanner_on may produce java.lang.nullPointerException
我很困惑,无法解决此警告。如果有人可以帮助我从中脱身,请告诉我。
由于
答案 0 :(得分:10)
这只是一个警告,因为如果响应成功,它将永远不会为空。您可以忽略它或环绕if(response.body() != null)
以删除警告。
Ads ads = response.body();
if(ads != null){
constant.banner_on = ads.getBanner_on();
// and so on.
}
答案 1 :(得分:0)
只需使用此null
指针检查。
If(response != null && response.isSuccessfull())
{
// body
}
答案 2 :(得分:0)
在从响应句柄null pointer exception
分配任何值之前,这是一个好习惯,以防止出现异常。您还可以使用try
和catch
来处理其他异常。
if(response.isSuccessful()) {
try {
if(response.body() != null){
constant.banner_on = response.body().getBanner_on();
constant.int_on = response.body().getInt_on();
constant.int_click = response.body().getInt_click();
}
} catch (IOException e) {
e.printStackTrace();
}
}
答案 3 :(得分:0)
使用if
很棒,但是只有一行,更简洁的方法是:
constant.banner_on = ads != null ? ads.getBanner_on() : null;
如果您在分配前使用Java 8, you can do a assertion:
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 answer about this is here。还有read this to get understanding why we need to explicitly check.。