问题
I am using Retrofit 2 for get response from my API and store its value in my constant like below
if(response.isSuccessful()) {
constant.banner_on = response.body().getBanner_on();
constant.int_on = response.body().getInt_on();
constant.int_click = response.body().getInt_click();
}
its giving me warning on all three like below
Method invocation getBanner_on may produce java.lang.nullPointerException
I am confused and unable to resolve this warning. Let me know if someone can help me to come out from this.
Thanks
回答1:
It is just a warning as it will never be null if the response is successful. You can ignore it or wrap around if(response.body() != null) to remove the warning.
Ads ads = response.body();
if(ads != null){
constant.banner_on = ads.getBanner_on();
// and so on.
}
回答2:
Just use this null pointer check.
If(response != null && response.isSuccessfull())
{
// body
}
回答3:
Its a good habit to before assigning any value from response handle null pointer exception to prevent some of exception. And you can also use try and catch to handle other exceptions.
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();
}
}
回答4:
Using if is great but there is only one line, much cleaner way is:
constant.banner_on = ads != null ? ads.getBanner_on() : null;
If you are using Java 8, you can do a assertion before assignment:
Ads ads = response.body();
assert ads != null;
constant.banner_on = ads.getBanner_on();
Another way to do this is using Objects.requireNonNull() before assignment:
constant.banner_on = Objects.requireNonNull(ads.getBanner_on());
That is actually designed primarily for param validation. Source code comment:
/**
* 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>
*
One great SO answer about this is here. Also read this to get understanding why we need to explicitly check..
来源:https://stackoverflow.com/questions/46519388/method-invocation-may-produce-nullpointerexception-retrofit-body