Android编程中常见的空指针异常

在Android编程中,空指针异常通常是不出现则以一出现就有惊人的破坏力。
下面我们一起来看看常见的破坏力:

一、常见的导致空指针异常的情景小结

1.Object为null,导致.equals等操作时,发生空指针异常

2.List为null,导致.size等操作时,报空指针异常

3.使用别人提供的接口、平台的接口,返回的对象是null

4.调用第三方接口/SDK或使用服务时,返回为null

5.自己创建的对象值为null,使用时报空指针异常

6.findViewbyId时,出现空指针异常

7.fragement.getActivity()返回null,导致空指针异常

8.涉及到数据库的操作,导致空指针异常

9.使用Object.toString()时,出现空指针异常

10.与其他应用或者第三方软件交互时(接口、SDK、Intent、数据等),发生
了空指针异常

11.应用解析文件时,文件是损坏的,导致空指针异常

12.使用NFC、T卡热插拔、相机、红外遥控器等硬件设备时,发生空指针异常

13.快速操作时,手机性能所致,导致空指针异常

14.打印log时,出现空指针异常

15.误删xml代码,导致id找不到

二、常见的导致空指针异常的举例与预防

1、Object为null,导致.equals等操作时,发生空指针异常

原则:从已知的Object对象中调用equals()方法,而非未知对象:总是从已知的非空Object对象中调用equals()方法。因为equals()方法是对称的,调用a.equals(b)和调用b.equals(a)是完全相同的,如果调用者是空指针,这种调用可能导致一个空指针异常,这是避免空指针异常最简单的技巧,因为equals()是一个常见方法,养成这个习惯可以对代码有巨大的改善。

例如:

String nullStr = null;
nullStr.equals("abc");//错误
"abc".equals(nullStr);//正确

2、List为null,导致.size等操作时,报空指针异常

原则:创建数组对象或者一个方法返回数组时,不要赋值或返回null,而是返回空collection或者空数组:这个技巧通过返回一个空collection或者空数组,可以确保在调用如size(),length()的时候不会因为空指针异常崩溃。Collections类提供了方便的空List,Set和Map:
Collections.EMPTY_LIST
Collections.EMPTY_SET
Collections.EMPTY_MAP

例如:

public List newList(){
    List nullList= Collections.EMPTY_LIST;
    return result;

3、findViewbyId()时,出现空指针异常

原则:布局在修改时,需要同步修改所有分辨率:调整应用布局时,很多情况下,只是在一个分辨率下修改,例如xhdpi的布局文件中添加了一个id,但是在hdpi下未添加,这就会导致在xhdpi的机型上测试无问题,一旦切换到hdpi分辨率的机型上,由于hdpi的布局文件没有该id,导致代码中findViewbyId时,find不到,出现空指针异常。这种情况就需要在修改布局时,同步修改所有的分辨率。

4、fragement.getActivity()时为空

原则:fragement.getActivity()得到的Context,使用前,一定要进行非空判断:这个属于android的一个bug,如果系统内存不足、或者切换横竖屏、或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致Fragment丢失对应的Activity,此时获取出来的Context是空,所以在使用fragement.getActivity()获取到的Context,在使用前,一定要进行非空判断;该问题现阶段没有根本解决办法,只能通过非空判断规避或者进行try
catch捕获异常。