Arraylist抛出Nullpointer异常在Android版本下面棉花糖

问题描述:

我想使用feedparser库RssReader。它在Android M & N上正常工作,但在版本L和更低版本上崩溃。 这里是我做了什么Arraylist抛出Nullpointer异常在Android版本下面棉花糖

ReadRss readRss = new ReadRss(this, recyclerView); 
     isNetworkAvailable(); 
     if (isNetworkAvailable()) { 
      readRss.execute(); 
     } else { 
      Toast.makeText(getBaseContext(), "Couldn't connect to Internet.", Toast.LENGTH_LONG).show(); 
     } 

ReadRss如下

class ReadRss extends AsyncTask<Void, Void, Void> { 
Context context; 
private ProgressDialog progressDialog; 
private ArrayList<FeedItem> feedItems; 
private RecyclerView recyclerView; 

ReadRss(Context context, RecyclerView recyclerView) { 
    this.recyclerView = recyclerView; 
    this.context = context; 
    progressDialog = new ProgressDialog(context); 
    progressDialog.setMessage("Loading..."); 
} 

@Override 
protected void onPreExecute() { 
    progressDialog.show(); 
    super.onPreExecute(); 
} 

@Override 
protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 
    progressDialog.dismiss(); 
    RssAdapter adapter = new RssAdapter(context, feedItems); 
    recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
    recyclerView.addItemDecoration(new VerticalSpace(50)); 
    recyclerView.setAdapter(adapter); 
} 

@Override 
protected Void doInBackground(Void... params) { 
    ProcessXml(Getdata()); 

    return null; 
} 

private void ProcessXml(Document data) { 
    try { 
     URL url = new URL("http:pockettanksnews.blogspot.com/feeds/posts/default"); 
     HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection(); 
     if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
      InputStream feedStream = httpConnection.getInputStream(); 
      FeedParser parser = FeedParserFactory.newParser(); 
      System.out.println("success"); 
      Feed feed = parser.parse(feedStream); 
      feedItems=new ArrayList<>(); 
      for (Item i : feed.getItemList()) { 
       FeedItem item=new FeedItem(); 
       System.out.println(i.getTitle()); 
       item.setTitle(i.getTitle()); 
       System.out.println(i.getLink()); 
       item.setLink(i.getLink()); 
       System.out.println(i.getPubDate()); 
       item.setPubDate(i.getPubDate().toString()); 
       item.setThumbnailUrl("https:1079638729.rsc.cdn77.org/androidgame_img/pocket_tanks/real/1_pocket_tanks.jpg"); 
       item.setDescription(i.getDescription()); 
       feedItems.add(item); 
      } 

     } else { 
      System.out.println("error"); 
     } 
    } 
    catch (Exception except){ 
     ; 
    } 
} 

private Document Getdata() { 
    try { 
     String address = "http://pockettanksnews.blogspot.com/feeds/posts/default/-/pttipsyoutube/?alt=rss"; 
     URL url = new URL(address); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     InputStream inputStream = connection.getInputStream(); 
     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
     Document xmlDoc = builder.parse(inputStream); 
     return xmlDoc; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

和我RssAdapter是如下

public class RssAdapter extends RecyclerView.Adapter<RssAdapter.MyViewHolder> { 
ArrayList<FeedItem> feedItems=new ArrayList<FeedItem>(); 
Context context; 

public RssAdapter(Context context, ArrayList<FeedItem> feedItems) { 
    this.feedItems = feedItems; 
    this.context = context; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(context).inflate(R.layout.custum_row_news_item, parent, false); 
    MyViewHolder holder = new MyViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    FeedItem current = feedItems.get(position); 
    holder.Title.setText(current.getTitle()); 
    holder.Description.loadDataWithBaseURL("", current.getDescription(), "text/html", "UTF-8", ""); 
    holder.Date.setText(current.getPubDate()); 

} 

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

public class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView Title, Date; 
    WebView Description; 
    ImageView Thumbnail; 
    CardView cardView; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     Title = (TextView) itemView.findViewById(R.id.title_text); 
     Description = (WebView) itemView.findViewById(R.id.description_text); 
     Description.getSettings().setJavaScriptEnabled(true); 
     Date = (TextView) itemView.findViewById(R.id.date_text); 
     Thumbnail = (ImageView) itemView.findViewById(R.id.thumb_img); 
     cardView = (CardView) itemView.findViewById(R.id.cardview); 
    } 
} 

上getItemCount方法的应用程序崩溃。它显示空指针异常:尝试在空对象引用上调用虚拟方法'int java.util.ArrayList.size()'。

如果发生错误,您的提要将变为空。所以改变你的代码并处理它。

// Add null check here. 
if(feedItems!= null) { 
RssAdapter adapter = new RssAdapter(context, feedItems); 
recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
recyclerView.addItemDecoration(new VerticalSpace(50)); 
recyclerView.setAdapter(adapter); 
} else { 
// Show some error 
} 

处理此空指针的另一种方法是在适配器内部添加空检查。

public RssAdapter(Context context, ArrayList<FeedItem> feedItems) { 
if(feedItems!= null) { 
this.feedItems.addAll(feedItems); 
} 
this.context = context; 
} 

然后尝试找出异常,如果有任何从服务器获取数据。我相信只有Getdata()方法负责。

+0

我会在任何情况下实际初始化'feedItems',即使在'onPreExecute'函数中。然后'getItemCount'将会起作用,并且如果错误或为空则返回0。 – lionscribe

+0

但是您只是在ProcessXml()方法中的Response_OK(200)的情况下创建初始化列表,如果您没有得到Response_OK,那么您的Async类中的feedItems将为null。 – Rahul

+0

这并没有解决问题。 RSS饲料仍然没有加载。 –