Java 如果缓存为空,请改装NPE

Java 如果缓存为空,请改装NPE,java,android,caching,retrofit,Java,Android,Caching,Retrofit,我添加了缓存的可能性,出现了以下脚本: 如果以前上传过网页,一切都正常,但是如果我第一次不上网 然后应用程序崩溃并抛出错误 NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference at java.util.ArrayList.<init>(ArrayList.ja

我添加了缓存的可能性,出现了以下脚本: 如果以前上传过网页,一切都正常,但是如果我第一次不上网 然后应用程序崩溃并抛出错误

NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
    at java.util.ArrayList.<init>(ArrayList.java:171)
    at n.MainDetailTrainFragment$3.onResponse(MainDetailTrainFragment.java:171)
NullPointerException:尝试对空对象引用调用接口方法“java.lang.Object[]java.util.Collection.toArray()”
位于java.util.ArrayList。(ArrayList.java:171)
位于n.MainDetailTrainFragment$3.onResponse(MainDetailTrainFragment.java:171)
我理解这个错误,但是我怎样才能修复它呢

不要严格评判,我只是在学习。 这是我的密码^

progressBarTrain.setVisibility(View.VISIBLE);
    Log.d(TAG, "getProducts");

   final OkHttpClient client = new OkHttpClient
           .Builder()
           .cache(new Cache(getActivity().getCacheDir(), 10 * 1024 * 1024)) // 10 MB
           .addInterceptor(new Interceptor() {
               @Override public okhttp3.Response intercept(@NonNull Chain chain) throws IOException {
                   Request request = chain.request();
                   if (NetworkUtils.isNetworkAvailable(getActivity())) {
                       request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build();
                   } else {
                       request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build();
                   }
                   return chain.proceed(request);
               }
           })
           .build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MY_URL)
            .client(client)
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .build();

    retrofit.create(myTrainInterface.class)
            .getProducts(APP_ID, FROM_CITY, position_0, "everyday")
            .enqueue(new Callback<Responce>() {
                @SuppressLint("SetTextI18n")
                @Override
                public void onResponse(@NonNull Call<Responce> call, @NonNull Response<Responce> response) {
                    progressBarTrain.setVisibility(View.INVISIBLE);
                    if (response.body() != null) {
                        kk = response.body().products;
                    }
                    ArrayList<Responce.Item> p = new ArrayList<>(kk);
                    String s = String.valueOf(response.body());




                    adapter = new DetailTrainAdapter(p);
                    recyclerView.setAdapter(adapter);
                    Log.d(TAG, s);

                    textError.setVisibility(TextView.INVISIBLE);
                    textErrorRestart.setVisibility(TextView.INVISIBLE);
                }

                @Override
                public void onFailure(@NonNull Call<Responce> call, @NonNull Throwable throwable) {
                    Log.d(TAG, "onFailure" + throwable.getLocalizedMessage());
                    textError();
                }
            });
progressBarTrain.setVisibility(View.VISIBLE);
Log.d(标签“getProducts”);
最终OkHttpClient客户端=新OkHttpClient客户端
.Builder()
.cache(新缓存(getActivity().getCacheDir(),10*1024*1024))//10 MB
.addInterceptor(新拦截器(){
@重写公共okhttp3。响应截获(@NonNull Chain Chain)引发IOException{
Request=chain.Request();
if(NetworkUtils.isNetworkAvailable(getActivity())){
request=request.newBuilder().header(“缓存控制”,“公共,最大年龄=“+60”).build();
}否则{
request=request.newBuilder().header(“缓存控制”,“公共,仅当缓存时,max stale=“+60*60*24*7”).build();
}
返回链。继续(请求);
}
})
.build();
改装改装=新改装.Builder()
.baseUrl(我的URL)
.客户(客户)
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();
创建(myTrainInterface.class)
.getProducts(应用程序ID,来自城市,位置0,“每天”)
.enqueue(新的回调函数(){
@SuppressLint(“SetTextI18n”)
@凌驾
public void onResponse(@NonNull调用,@NonNull响应){
progressBarTrain.setVisibility(View.INVISIBLE);
if(response.body()!=null){
kk=response.body().产品;
}
ArrayList p=新的ArrayList(kk);
String s=String.valueOf(response.body());
适配器=新的适配器(p);
recyclerView.setAdapter(适配器);
日志d(标签s);
textError.setVisibility(TextView.INVISIBLE);
textErrorRestart.setVisibility(TextView.INVISIBLE);
}
@凌驾
public void onFailure(@NonNull Call Call,@NonNull Throwable Throwable){
Log.d(标记“onFailure”+throwable.getLocalizedMessage());
textError();
}
});

当变量
kk
null
时,将抛出NPE。 查看您的代码,您正在创建一个响应列表(如果不是
null
),然后使用它填充您的UI。但是,如果响应为
null
您没有向
kk
分配任何内容,那么它将保持其以前的值(考虑到NPE,很可能是
null


避免这种情况的一个可能的解决方案是执行创建适配器的所有逻辑,并且仅当
response.body()!=null
,否则您可能需要执行其他操作(例如,显示错误)。

谢谢,我根据您的建议移动了逻辑,一切都开始正常工作)。