[Crash分析] java.lang.NullPointerException

【类型定位】

  java.lang.NullPointerException这种类型crash对应着最常见的空指针引用错误。一般我们在调用对象的方法前都会去检查一下对象是否为空,如果为空就不能进行调用方法的操作。很多同学会有这样的感觉:我平常用对象都会先判空,不会出现这样的低级错误。开始我也是这样认为的,怎么可能会在空指针这样的问题上犯错误呢,后来在项目上线上收集的crash分析来看,就的的确确存在这样的空指针调用引起的crash,而且这部分crash的还不在少数。
  一般显示调用对象方法前,我都会先进行一下判空操作。可是对于隐式调用,就可能存在上面提出的这类crash。在项目中,我们遇到的crash也是这类隐式的crash.
指针判空操作
  

【解决方案】

增加指针的判空操作,只有在非空情况下才会进行相关操作。需要着重注意对象的隐式方法调用。

【代码展示】

public class MainActivity extends AppCompatActivity {

    private List<String> datas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        traverseList();
    }

    void traverseList() {
        for (String str: datas) {
            // do something
            Log.d("MainActivity", str);
        }
    }
}

上面的代码中traverseList遍历list中的所有元素就存在这种crash的风险,因为这种调用方法明面上看不存在对象的调用,但实际调用了datas.size进行遍历。而如果此时data对象为空,就会产生本文所提到的crash。解决此类crash的方法也很简单,在隐式调用前添加判空处理

    void traverseList() {
        if (datas != null) {
            for (String str: datas) {
                // do something
                Log.d("MainActivity", str);
            }
        }
    }

【个人总结】

  1. java.lang.NullPointerException对应着空指针调用crash
  2. 这种crash一定要注意一些容器的for循环遍历,首先保证数据对象非空再进行遍历
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值