If 用法

先来看一个经典的写法 (Android Adapter 的一个实现方法 getView)

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    PosPaiHangBean.SaleNumListBean goodsAmount = mSaleNumbers.get(position);

    if (goodsAmount.getGoodsNum() > 0) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_ranking_salenumber, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        ...
    }
    return convertView;
}

然后这段代码会偶尔报一个系统的 error ,log 如下:

AndroidRuntime: FATAL EXCEPTION: main                                                          java.lang.NullPointerException
                                                              at android.widget.AbsListView.obtainView(AbsListView.java:2161)
                                                              at android.widget.ListView.makeAndAddView(ListView.java:1831)
                                                              at android.widget.ListView.fillDown(ListView.java:674)
                                                              
                                                             ...

看到这个错误,心中暗喜,Google 那帮傻逼也会犯错哈,哈哈,你看。。

然并卵,我们的标题已经标注了问题的关键在于 if 的用法。

终于步入正题,先来分析下错误的原因,相信聪明的你,已经发行了问题所在:

在没有满足 if 的条件会直接返回原来的 convertView,初始化时会原原本本的返回一个 null,

这就触发上面的 log,出现这个错误的原因表面看是因为返回了 null,然而根本原因是

没有掌握好 if 的用法,我们平时写代码都会犯一个不起眼的错误:只写一个 if ,不写 else,

这就是相当于:事物的两面性,我们只看到我们想要的那一面,另一面选择了无视,这样就出现

程序潜在错误,else 可以更全面的解决问题。

正常的 if 写法应当如下:

if (...) {
  if (...) {
    ...
  } else {
    ...
  }
} else if (...) {
  ...
} else {
  ...
}

是不是看起来很优雅,枝丫分明的树状结构。