If 用法
12 Aug 2016先来看一个经典的写法 (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 {
...
}
是不是看起来很优雅,枝丫分明的树状结构。