[Crash分析] java.lang.NullPointerException

来源:互联网 发布:2013日本进出口数据 编辑:程序博客网 时间:2024/06/11 18:51

【类型定位】

  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
原创粉丝点击