【问题标题】:Android Attempt to read on a null object referenceAndroid 尝试读取空对象引用
【发布时间】:2015-04-28 23:00:14
【问题描述】:

我希望从 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));

【问题讨论】:

  • “我该如何解决这个问题?”确保变量hold 不是null
  • 看起来您的 data 为空。检查您是否正确初始化它。
  • 更准确地说,data 数组中有空值。 (data[position] 正在评估 null 以获得一些 position 值。)
  • @Melquiades 不幸的是,data 不能为空。如果是这样,NPE 将发生在Answer hold = data[position] 行。所以肯定是data引用的数组包含null的值。
  • @TedHopp 你认为如果我检查每个 if(data[position]!=null){...} 会解决这个问题吗?

标签: java android nullpointerexception adapter


【解决方案1】:

您的data 数组包含空值。这是 NPE 的直接原因,因为 hold 对于某些职位最终会变成 null。如果您对此进行测试,您将避免 NPE,但是(正如您在评论中指出的那样)您的适配器将无法正常运行。您不能简单地忽略具有 null 数据值的行。

顺便说一句,您应该删除data 成员字段。 ArrayAdapter 超类已经保存了数组引用。只要您使用data[position],只需使用getItem(position)。虽然这不会解决 NPE 问题,但它会简化一些事情,如下所示。

您有多种选择:

  1. 首先找出为什么data 的某些条目是null 并消除根本问题。但是,data 具有 null 条目可能是正常的(在适配器的上下文之外)。
  2. 修改您的getView 方法,将holder 中的视图设置为一些指示“数据丢失”的特定值——可能是空白,也可能是“无数据”消息。 (换句话说,不要简单地跳过所有处理。这是导致空白行和重复行组合的原因。)
  3. 修改构造函数以从data 中删除null 条目。这将导致更短的列表。完成此操作的一些代码可能是:

    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中的默认实现完全相同。

【讨论】:

  • 嗨,泰德,我想知道你是否可以帮助我解决这个问题question。我保证,这不是那些“为我解决这个问题”的问题之一。
【解决方案2】:

只需更改此行.....

Answer data[] = null;

Answer[] data = null;

【讨论】:

  • 这两个不一样吗?无论如何,进行此更改无济于事,因为应用程序无论如何都会崩溃。
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多