空指针概念:

1.所谓的指针,就是java中的对象的引用。比如String s;这个s就是指针。

2.所谓的空指针,就是指针的内容为空,比如上面的s,如果令它指向null,就是空指针。

3.所谓的空指针异常,就是一个指针是空指针,你还要去操作它,既然它指向的是空对象,它就不能使用这个对象的方法。比如上面的s假如为null,你还要用s的方法,比如s.equals(String x);那么就会产生空指针异常。

原因:

1.字符串变量未初始化;
2.接口类型的对象没有用具体的类初始化,比如: List lt;会报错 List lt = new ArrayList();则不会报错了 3.当一个对象的值为空时,你没有判断为空的情况。你可以试着把下面的代码前加一行代码:
if(rb != null && rb != “”) 改成: if(rb==null); if(rb!==null&&rb!=”“) 或者if((“”).equals(rb))

解决办法:

代码段1:

out.println(request.getParameter("username"));

分析:代码段1的功能十分简单,就是输出用户输入”username”的值。

说明:看上去,上面的语句找不出什么语法错误,而且在大多数情况下也遇不到什么问题。但是,如果某个用户在输入数据时并没有提供表单 域”username” 的值,或通过某种途径绕过表单直接输入时,此request.getParameter(“username”)的值为空(注意不是空字符串,是空对象 null。),out对象的println方法是无法直接对空对象操作的,因此代码段1所在的JSP页面将会抛出 “Java.lang.NullPointerException”异常。
而且即使对象可能为空时,也调用Java.lang.Object或 Object对象本身的一些方法如toString(), equal(Object obj)等操作。

代码段2:

String userName = request.getParameter("username");  
If (userName.equals("root"))   {....}

分析:代码段2的功能是检测用户提供的用户名,如果是用户名称为”root”的用户时, 就执行一些特别的操 作。

说明:在代码段2中,如果有用户没有提供表单域”username”的值时,字符串对象userName为null值,不能够将一个null的对象与另一 个对象直接比较,同样,代码段2所在的JSP页面就会抛空指针错误。 一个小技巧:如果要把某个方法的返回值与常量做比较,把常量放在前面,可以避免调用null对象的equals方法。譬如:
If (“root”.equals(userName)) {….}
即使userName对象返回了null对象,这里也不会有空指针异常,可以照常运转。

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

public class Test {

    public static void main(String[] args) {
        Person person = new Person(null, 1);

        //boolean b = (person.name).equals("xq");//避免这种写法,会报空指针

        //推荐下面这种写法,对字符串比较时,如果和常量进行比较,把常量放在前面
        boolean b = "xq".equals(person.name);

        //或者添加字符串为null判断:
        //if(TextUtils.isEmpty(str)){
            //doSometing
        //}
    }


    public static class Person{
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}

String 类的方法:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = count;
        if (n == anotherString.count) {
            int i = 0;
            while (n-- != 0) {
                if (charAt(i) != anotherString.charAt(i))
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

当anObject不为String 时(比如为null),直接返回false,不会报错

字符串的空指针避免方法:

1、判断字符串是否空

if(TextUtils.isEmpty(str)){
        //doSometing
    }

2、对字符串比较时,如果和常量进行比较,把常量放在前面,比如:

“good".equals(var)  优于  var.equals("good")

3、将某个对象 toString时,比如:

String.valueOf(obj)   优于  obj.toString()

fragement.getActivity()时为空

解决:操作前添加判断:

//判断Activity是否Destroy
protected boolean isDestroy(Activity activity) {
return activity == null || activity.isFinishing() ||
        (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed());
}