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捕获异常。