android试图读取空对象引用

o2g1uqev  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(409)

我想从json内容创建一个列表。这是我的适配器代码:

public class AnswersAdapter extends ArrayAdapter<Answer> {

    static Context context;
    static int layoutResourceId;
    Answer data[] = null;

    public AnswersAdapter(Context context, int layoutResourceId, Answer[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        AnswerHolder holder = null;
        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new AnswerHolder();
            holder.txtTitle = (TextView)row.findViewById(R.id.answerText);
            holder.txtTitle2 = (TextView)row.findViewById(R.id.answerAuthor);
            holder.txtTitle3 = (TextView)row.findViewById(R.id.answerVotes);
            row.setTag(holder);
        }
        else
        {
            holder = (AnswerHolder)row.getTag();
        }
        Answer hold = data[position];
            holder.txtTitle.setText(Html.fromHtml(hold.text));
            holder.txtTitle2.setText(hold.author);
            holder.txtTitle3.setText(hold.votes);

        return row;
    }

    static class AnswerHolder
    {
        TextView txtTitle;
        TextView txtTitle2;
        TextView txtTitle3;
    }
}

我面临这个错误:
java.lang.nullpointerexception:尝试读取空对象引用上的字段“java.lang.string com.example.shivam.stackoverflow.answer.text”
在这条线上

holder.txtTitle.setText(Html.fromHtml(hold.text));
0g0grzrc

0g0grzrc1#

你的 data 数组有空值。这是npe的直接原因,因为 hold 最终成为 null 对于某些职位。如果您为此进行测试,您将避免使用npe,但是(正如您在注解中指出的那样)您的适配器的行为不太正常。不能简单地忽略具有 null 数据值。
作为旁白,你应该消除 data 成员字段。数组引用已由保留 ArrayAdapter 超类。只是使用 getItem(position) 无论你什么时候用 data[position] . 虽然这不会解决npe问题,但它会简化一些事情,如下所示。
您有几种选择:
找出 datanull 从根本上解决问题。但是,对于 data 拥有 null 条目。
修改你的 getView 方法来设置视图 holder 某些特定值表示“数据丢失”-可能为空,也可能是“无数据”消息(换句话说,不要简单地跳过所有处理。这就是导致空行和重复行组合的原因。)
修改构造函数以消除 null 来自的条目 data . 这将导致名单缩短。实现这一点的一些代码可能是:

public AnswersAdapter(Context context, int layoutResourceId, Answer[] data) {
    super(context, layoutResourceId, trimmedData(data));
    this.layoutResourceId = layoutResourceId;
    this.context = context;
}

/**
 * Copy data to a new array that has no nulls.
 */
private static Answer[] trimmedData(Answer[] data) {
    Answer[] result = new Answer[data.length];
    int n = 0;
    for (Answer a : data) {
        if (a != null) {
            result[n++] = a;
        }
    }
    if (n < data.length) {
        result = Arrays.copyOf(result, n, Answer.class);
    }
    return result;
}

但是,如果您需要维护 ListView 位置和原件 data 数组。
另一个旁白是:你可以消除 getItemId() 方法;中的默认实现 ArrayAdapter 做同样的事。

zaq34kh6

zaq34kh62#

把这条线改一下。。。。。

Answer data[] = null;

Answer[] data = null;

相关问题