-1

Ci-dessous mes extraits de code et mon panier de journaux. Le journal des erreurs me dirige vers cette ligne dans le code de la classe Adapter.NullPointerException Lorsque vous récupérez des icônes d'actualités dans l'affichage recycleur depuis l'URL et qu'une icône est manquante dans l'URL

if (response.body().getIcons().size() > 0) 

studio spécifiquement android me met en garde contre que la condition getIcons() a le potentiel de provoquer l'apparition de erreur de pointeur NULL.

package com.example.hamisi.sportsnewsultra.Model; 

import java.util.List; 

/** 
* Created by hamisi on 10/6/17. 
*/ 

public class IconBetterIdea { 
    private String url; 
    private List<Icon> icons; 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public List<Icon> getIcons() { 
     return icons; 

    } 

    public void setIcons(List<Icon> icons) { 
     this.icons = icons; 
    } 
} 

La classe d'icônes.

package com.example.hamisi.sportsnewsultra.Model; 

/** 
* Created by hamisi on 10/6/17. 
*/ 

public class Icon { 
    private String url; 
    private int width,height,bytes; 
    private String format,sha1sum; 
    private Object error; 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public int getWidth() { 
     return width; 
    } 

    public void setWidth(int width) { 
     this.width = width; 
    } 

    public int getHeight() { 
     return height; 
    } 

    public void setHeight(int height) { 
     this.height = height; 
    } 

    public int getBytes() { 
     return bytes; 
    } 

    public void setBytes(int bytes) { 
     this.bytes = bytes; 
    } 

    public String getFormat() { 
     return format; 
    } 

    public void setFormat(String format) { 
     this.format = format; 
    } 

    public String getSha1sum() { 
     return sha1sum; 
    } 

    public void setSha1sum(String sha1sum) { 
     this.sha1sum = sha1sum; 
    } 

    public Object getError() { 
     return error; 
    } 

    public void setError(Object error) { 
     this.error = error; 
    } 
} 

L'adaptateur. Voici où la ligne étant pointée vers moi par studio android comme la source de l'erreur est située.

package com.example.hamisi.sportsnewsultra.Adapter; 

import android.content.Context; 
import android.content.Intent; 
import android.support.annotation.NonNull; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.example.hamisi.sportsnewsultra.Common.Common; 
import com.example.hamisi.sportsnewsultra.Interface.IconBetterIdeaService; 
import com.example.hamisi.sportsnewsultra.Interface.ItemClickListener; 
import com.example.hamisi.sportsnewsultra.ListNews; 
import com.example.hamisi.sportsnewsultra.Model.IconBetterIdea; 
import com.example.hamisi.sportsnewsultra.Model.WebSite; 
import com.example.hamisi.sportsnewsultra.R; 
import com.squareup.picasso.Picasso; 

import de.hdodenhof.circleimageview.CircleImageView; 
import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 

/** 
* Created by hamisi on 10/6/17. 
*/ 

class ListSourceViewHolder extends RecyclerView.ViewHolder 
    implements View.OnClickListener 
{ 
    ItemClickListener itemClickListener; 

    TextView source_title; 
    CircleImageView source_image; 

    public ListSourceViewHolder(View itemView) { 
     super(itemView); 

     source_image = (CircleImageView) itemView.findViewById(R.id.source_image); 
     source_title = (TextView)itemView.findViewById(R.id.source_name); 

     itemView.setOnClickListener(this); 
    } 

    public void setItemClickListener(ItemClickListener itemClickListener) { 
     this.itemClickListener = itemClickListener; 
    } 

    @Override 
    public void onClick(View view) { 
     itemClickListener.onClick(view,getAdapterPosition(),false); 

    } 
} 

public class ListSourceAdapter extends RecyclerView.Adapter<ListSourceViewHolder>{ 
    private Context context; 
    private WebSite webSite; 

    private IconBetterIdeaService mService; 

    public ListSourceAdapter(Context context, WebSite webSite) { 
     this.context = context; 
     this.webSite = webSite; 

     mService = Common.getIconService(); 
    } 

    @Override 
    public ListSourceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     View itemView = inflater.inflate(R.layout.source_layout,parent,false); 
     return new ListSourceViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final ListSourceViewHolder holder, int position) { 

     StringBuilder iconBetterAPI = new StringBuilder("https://icons.better-idea.org/allicons.json?url="); 
     iconBetterAPI.append(webSite.getSources().get(position).getUrl()); 

     mService.getIconUrl(iconBetterAPI.toString()) 
       .enqueue(new Callback<IconBetterIdea>() { 
        @Override 
        public void onResponse(@NonNull Call<IconBetterIdea> call, @NonNull Response<IconBetterIdea> response) { 
         if (response.body().getIcons().size() > 0) 
         { 
          Picasso.with(context) 
            .load(response.body().getIcons().get(0).getUrl()) 
            .into(holder.source_image); 
         } 
        } 

        @Override 
        public void onFailure(Call<IconBetterIdea> call, Throwable t) { 
        } 
       }); 
     holder.source_title.setText(webSite.getSources().get(position).getName()); 

     holder.setItemClickListener(new ItemClickListener() { 
      @Override 
      public void onClick(View view, int position, boolean isLongClick) { 
       Intent intent = new Intent(context, ListNews.class); 
       intent.putExtra("source", webSite.getSources().get(position).getId()); 
       intent.putExtra("sortBy", webSite.getSources().get(position).getSortBysAvailable().get(0)); //get detail sort by method 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(intent); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return webSite.getSources().size(); 
    } 
} 

Le journal des erreurs est illustré ci-dessous.

10-11 11: 41: 47,328 27239-27239/com.example.hamisi.sportsnewsultra E/AndroidRuntime: FATAL EXCEPTION: principal processus: com.example.hamisi.sportsnewsultra, PID: 27239 java .lang.NullPointerException: tentative d'invoquer la méthode virtuelle 'java.util.List com.example.hamisi.sportsnewsultra.Model.IconBetterIdea.getIcons()' sur une référence d'objet null à com.example.hamisi.sportsnewsultra .Adapter.ListSourceAdapter $ 1.onResponse (ListSourceAdapter.java:88) a t retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall 1 1.run $ (ExecutorCallAdapterFactory.java:70) à android.os.Handler.handleCallback (Handler.java:815) à android.os.Handler.dispatchMessage (Handler.java:104) à android.os.Looper.loop (Looper.java:194) à android.app.ActivityThread.main (ActivityThread.java:5637) à java.lang.reflect.Method.invoke (Méthode natif) à java .lang.reflect.Method.invoke (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:960) à com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755)

Répondre

0

mettre à jour votre code ListSourceAdapter.java.

mService.getIconUrl(iconBetterAPI.toString()) 
       .enqueue(new Callback<IconBetterIdea>() { 
        @Override 
        public void onResponse(@NonNull Call<IconBetterIdea> call, @NonNull Response<IconBetterIdea> response) { 
         if (response.body()!=null && response.body().getIcons()!=null && response.body().getIcons().size() > 0 && !TextUtils.isEmpty(response.body().getIcons().get(0).getUrl())) 
         { 
          Picasso.with(context) 
            .load(response.body().getIcons().get(0).getUrl()) 
            .into(holder.source_image); 
         } 
        } 

        @Override 
        public void onFailure(Call<IconBetterIdea> call, Throwable t) { 
        } 
       }); 
+0

@J Ramesh Merci beaucoup. Cela a fonctionné désolé je ne suis pas autorisé à upvote votre réponse en raison de ma mauvaise réputation. Mais je l'ai marqué comme la réponse. Dieu te bénisse. –

+0

@ArossMickdad bienvenue frère ... pas de problème –