【问题标题】:Arraylist throwing Nullpointer exception in android versions below MarshmallowArraylist 在 Marshmallow 以下的 android 版本中抛出 Nullpointer 异常
【发布时间】:2016-11-27 05:41:41
【问题描述】:

我正在尝试通过 feedparser 库来使用 RssReader。它在 android M & N 上运行良好,但在 L 及以下版本上崩溃。 这就是我所做的

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()”。

【问题讨论】:

    标签: android arraylist nullpointerexception android-5.0-lollipop rss-reader


    【解决方案1】:

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

    // 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() 方法对此负责。

    【讨论】:

    • 无论如何我都会初始化feedItems,即使是在onPreExecute函数中。然后getItemCount 将起作用,如果错误或为空,则返回 0。
    • 但是您只在 ProcessXml() 方法中的 Response_OK(200) 的情况下创建初始化列表,如果您没有获得 Response_OK 那么您在 Async 类中的 feedItems 将为空。
    • 这并没有解决问题。 RSS 提要仍未加载。
    • 那个修复是处理空指针,试着找出你在获取服务器数据时遇到的异常。
    猜你喜欢
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2017-07-24
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多